Вопрос был обновлен для лучшего объяснения проблемы, с которой я столкнулся,
Просто у меня есть этот контроллер,
[Authorize]
public class IdeaManagementController : Controller
{
private IIdeaManagementService _ideaManagementService;
private ITenantService _tenantService;
private ITagService _tagService;
private IEmployeeIdeaCategoryService _ideaManagementCategoryService;
private static PbdModule _modul = PbdModule.IdeaManagement;
IAuthorizationService _authorizationService;
public IdeaManagementController(
IIdeaManagementService ideaManagementService,
ITenantService tenantService,
ITagService tagService,
IAuthorizationService authorizationService,
IEmployeeIdeaCategoryService ideaManagementCategoryService)
{
_ideaManagementService = ideaManagementService;
_tenantService = tenantService;
_tagService = tagService;
_authorizationService = authorizationService;
_ideaManagementCategoryService = ideaManagementCategoryService;
}
public async Task<IActionResult> IdeaCoordinator()
{
if (!await _authorizationService.AuthorizeAsync(User, "IdeaManagement_Coordinator"))
{
return new ChallengeResult();
}
var ideas = _ideaManagementService.GetByIdeaCoordinator(_tenantService.GetCurrentTenantId());
return View(ideas);
}
}
и просто мне нужно проверить повторное представление viewResult метода действия IdeaCoordinator, но я не мог просто потому, что если метод проверки _authorizationService.AuthorizeAsync, я пытался смоделировать метод, но просто не смог, потому что это встроенное расширение Затем в Method я попытался обойти решение, создав новый интерфейс, который реализует IAuthorizationService и Mock для этого настроенного интерфейса, подобного этому.
public interface ICustomAuthorizationService : IAuthorizationService
{
Task<bool> AuthorizeAsync(ClaimsPrincipal user, string policyName);
}
public IAuthorizationService CustomAuthorizationServiceFactory()
{
Mock<ICustomAuthorizationService> _custom = new Mock<ICustomAuthorizationService>();
_custom.Setup(c => c.AuthorizeAsync(It.IsAny<ClaimsPrincipal>(), "IdeaManagement_Coordinator")).ReturnsAsync(true);
return _custom.Object;
}
и внедрить его, пока я вызываю конструктор контроллера, а затем я оказался таким:
[Theory]
[InlineData(1)]
public async void IdeaManager_Should_Return_ViewResult(int _currentTenanatID)
{
// Arrange ..
_IdeaManagementControllerObject = new IdeaManagementController
(IdeaManagementServiceMockFactory(_currentTenanatID),
TenantServiceMockFactory(_currentTenanatID),
TagServiceMockFactory(),
AuthorizationServiceMockFactory(),
EmployeeIdeaCategoryServiceMockFactory());
// Act
var _view = await _IdeaManagementControllerObject.IdeaCoordinator() as ViewResult;
// Assert
Assert.IsType(new ViewResult().GetType(), _view);
}
Я ожидал других результатов, потому что я пометил возвращаемый результат как истинный, просто чтобы проигнорировать эту строку кода и перейти к Viewresult, но пока я снова отлаживал свой метод тестирования, компилятор попал в сообщение проверки, поскольку он не чувствовал изменений, которые я сделал в результате метода AuthorizeAsync.. 
Огромное спасибо заранее.
==Решение==
Введение:
«Мы не можем решить наши проблемы на том же уровне мышления, на котором они были созданы» — Альберт Эйнштейн. и с этим восхитительным высказыванием я хотел бы сообщить, что я потратил около 1 недели на решение этой проблемы, пока не почувствовал, что она никогда не будет решена в этот момент, я потратил часы на расследование, но после прочтения статьи и после изменения образа мышления, решение пришло через 30 мин.
Краткий обзор проблемы:
Просто я пытался выполнить модульное тестирование написанного выше метода действия, и у меня возникла серьезная проблема, связанная с тем, что я не мог издеваться над методом «AuthorizeAsync» и просто потому, что это встроенный метод расширения и из-за природы метода расширения как статический метод никогда не может быть сымитирован с помощью традиционного способа насмешки над классами.
Решение в деталях:
Чтобы иметь возможность издеваться над этим методом действия, я создал статический класс, который содержит статические делегаты, и с этими делегатами я буду издеваться или, как можно сказать, «обернуть» мой метод расширения заменой моих статических делегатов в моем классе модульного теста следующим образом .
public static class DelegateFactory
{
public static Func<ClaimsPrincipal, object, string, Task<bool>> AuthorizeAsync =
(c, o, s) =>
{
return AuthorizationServiceExtensions.AuthorizeAsync(null, null, "");
};
}
public Mock<IAuthorizationService> AuthorizationServiceMockExtensionFactory()
{
var mockRepository = new Moq.MockRepository(Moq.MockBehavior.Strict);
var mockFactory = mockRepository.Create<IAuthorizationService>();
var ClaimsPrincipal = mockRepository.Create<ClaimsPrincipal>();
mockFactory.Setup(x => x.AuthorizeAsync(It.IsAny<ClaimsPrincipal>(), It.IsAny<object>(), It.IsAny<string>())).ReturnsAsync(true);
return mockFactory;
}
и в моем тестовом методе я только что вызвал издевательский объект в экземпляре конструктора контроллера.
[Fact]
public async void IdeaCoordinator_When_AuthroizedUser_IsNotNull_But_IdeaManagement_Manager_Authorized_Return_View()
{
// Arrange
int approvedByID = data.GetTenantByID(1).TenantId;
_IdeaManagementControllerObject = new IdeaManagementController
(IdeaManagementServiceMockFactory().Object,
TenantServiceMockFactory().Object,
TagServiceMockFactory().Object,
AuthorizationServiceMockExtensionFactory().Object,
EmployeeIdeaCategoryServiceMockFactory().Object);
//Act
IdeaManagementServiceMockFactory().Setup(m => m.GetByIdeaCoordinator(approvedByID)).Returns(data.GetCordinatedEmpIdeas(approvedByID));
ViewResult _view = await _IdeaManagementControllerObject.IdeaCoordinator() as ViewResult;
var model = _view.Model as List<EmployeeIdea>;
// Assert
Assert.Equal(3, model.Count);
Assert.IsType(new ViewResult().GetType(), _view);
}
и, как говорится, «Единственная величайшая причина счастья — это благодарность». Я хотел бы поблагодарить Стивена Фукуа за его блестящее решение и статью http://www.safnet.com/writing/tech/2014/04/making-mockery-of-extension-methods.html< /а>
Всем спасибо :) !