Я бегу на вопрос где 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 не возвращает результат, так что всегда терпит неудачу.
Может ли кто-нибудь пролить свет на это поведение?
Я бы рекомендовал вам создать [MCVE] (http://stackoverflow.com/help/mcve), поскольку большая часть предоставленного кода не имеет отношения к проблеме, в то время как что-то действительно требуется, вероятно, отсутствует. Я имею в виду повторить проблему без какого-либо ASP-специфики и оставить только минимальный минимум в фактическом unittest, чтобы любой мог запустить его и получить тот же результат, что и тот, который вы получаете. –
'mockUnitOfWork.Setup (x => x.ResultRepository.GetById (It.IsAny())) .Returns ((int id) => GetById (results, id));' должен работать, чтобы можно было найти источник проблемы, пожалуйста, добавьте реализацию 'controller.GetResult' –