2017-01-08 5 views
0

Я бегу на вопрос где Moq не возвращает то, что я excpect используя следующий код:Mocking UnitOfWork/GenericRepository с Moq

[TestMethod] 
public void GetResultReturnsAResult() 
{ 
    var mockUnitOfWork = Arrange(); 
    // Arrange 
    var controller = new ResultsController(mockUnitOfWork.Object); 
    controller.Request = new HttpRequestMessage(); 
    controller.Configuration = new HttpConfiguration(); 

    // Act 
    var response = controller.GetResult(2); 

    // Assert 
    Assert.IsTrue(response is OkNegotiatedContentResult<Result>); 
    var contentResult = response as OkNegotiatedContentResult<Result>; 
    Assert.IsNotNull(contentResult); 
    Assert.IsNotNull(contentResult.Content); 
    Assert.IsTrue(contentResult.Content.ID == 2); 
} 

[TestMethod] 
public void GetResultReturnsNotFound() 
{ 
    var mockUnitOfWork = Arrange(); 

    // Arrange 
    var controller = new ResultsController(mockUnitOfWork.Object); 
    controller.Request = new HttpRequestMessage(); 
    controller.Configuration = new HttpConfiguration(); 

    // Act 
    var response = controller.GetResult(100); 

    // Assert 
    Assert.IsTrue(response is NotFoundResult); 
    var contentResult = response as NotFoundResult; 
    Assert.IsNotNull(contentResult); 
} 

private Mock<IUnitOfWork> Arrange() 
{ 
    var results = new List<Result>() 
    { 
     new Result() 
     { 
      ID = 1, 
      Name = "Result 1", 
      Modified = new DateTime(2017, 1, 1), 
      Created = new DateTime(2017, 1, 1), 
      CreatedBy = "Tester 1", 
      ModifiedBy = "Tester 2" 
     }, 
     new Result() 
     { 
      ID = 2, 
      Name = "Result 2", 
      Modified = new DateTime(2017, 1, 2), 
      Created = new DateTime(2017, 1, 2), 
      CreatedBy = "Tester 1", 
      ModifiedBy = "Tester 2" 
     }, 
    }; 

    var mockUnitOfWork = new Mock<IUnitOfWork>(); 
    var mockResultRepository = new Mock<IGenericRepository<Result>>(); 

    mockResultRepository.Setup(x => x.Get(null, null, "")) 
     .Returns(results); 
    mockResultRepository.Setup(x => x.GetById(It.IsAny<int>())) 
     .Returns((int id) => GetById(results, id)); 
    mockUnitOfWork.Setup(x => x.ResultRepository) 
     .Returns(mockResultRepository.Object); 

    return mockUnitOfWork; 
} 

private Result GetById(List<Result> results, int id) 
{ 
    return results.FirstOrDefault(r => r.ID == id); 
} 

В этом случае мое испытание TestMethods GetByID как бросить исключение с сообщением: Объект типа 'System.Object []' не может быть преобразован в тип 'System.Int32'.

Когда я изменить код насмешливый к этому:

mockResultRepository.Setup(x => x.Get(null, null, "")) 
    .Returns(results); 
mockUnitOfWork.Setup(x => x.ResultRepository) 
    .Returns(mockResultRepository.Object); 
mockUnitOfWork.Setup(x => x.ResultRepository.GetById(It.IsAny<int>())) 
    .Returns((int id) => GetById(results, id)); 

Тесты GetByID не сгенерирует исключение, но GetResultReturnsAResult не возвращает результат, так что всегда терпит неудачу.

Может ли кто-нибудь пролить свет на это поведение?

+2

Я бы рекомендовал вам создать [MCVE] (http://stackoverflow.com/help/mcve), поскольку большая часть предоставленного кода не имеет отношения к проблеме, в то время как что-то действительно требуется, вероятно, отсутствует. Я имею в виду повторить проблему без какого-либо ASP-специфики и оставить только минимальный минимум в фактическом unittest, чтобы любой мог запустить его и получить тот же результат, что и тот, который вы получаете. –

+0

'mockUnitOfWork.Setup (x => x.ResultRepository.GetById (It.IsAny ())) .Returns ((int id) => GetById (results, id));' должен работать, чтобы можно было найти источник проблемы, пожалуйста, добавьте реализацию 'controller.GetResult' –

ответ

0

Как было предложено Евгением Подскалом в комментариях, я создавал MCVE (download here) и сталкивался с решением. Он действительно был прав, что решение должно быть найдено в коде, который не был разделен первым.

Код, который возвращается исключением в

Object of type 'System.Object[]' cannot be converted to type 'System.Int32' 

был правильным в метании этого исключения, так как

GetById 

принимает

params object[] 

в качестве первого параметра.

Смежные вопросы