Есть ли способ настроить и проверить вызов метода, который использует выражение с помощью Moq?Настройка и проверка выражения с помощью Moq
Первой попытка это один я хотел бы получить его на работу, в то время как второй один является «заплата», чтобы позволить Assert
части работы (с проверкой части еще неисправным)
string goodUrl = "good-product-url";
[Setup]
public void SetUp()
{
productsQuery.Setup(x => x.GetByFilter(m=>m.Url== goodUrl).Returns(new Product() { Title = "Good product", ... });
}
[Test]
public void MyTest()
{
var controller = GetController();
var result = ((ViewResult)controller.Detail(goodUrl)).Model as ProductViewModel;
Assert.AreEqual("Good product", result.Title);
productsQuery.Verify(x => x.GetByFilter(t => t.Url == goodUrl), Times.Once());
}
Тхет тест завершается с ошибкой Assert
и выбрасывает исключение нулевой ссылки, потому что метод GetByFilter никогда не вызывается.
Если вместо этого я использую этот
[Setup]
public void SetUp()
{
productsQuery.Setup(x => x.GetByFilter(It.IsAny<Expression<Func<Product, bool>>>())).Returns(new Product() { Title = "Good product", ... });
}
Тест проходит часть Assert, но на этот раз это Убедитесь, что не в состоянии сказать, что он никогда не вызывается.
Есть ли способ настроить вызов метода с помощью определенного выражения вместо использования общего It.IsAny<>()
?
Update
Я попробовал также предложение по Ufuk Hacıoğulları в комментариях и создал следующий
Expression<Func<Product, bool>> goodUrlExpression = x => x.UrlRewrite == "GoodUrl";
[Setup]
public void SetUp()
{
productsQuery.Setup(x => x.GetByFilter(goodUrlExpression)).Returns(new Product() { Title = "Good product", ... });
}
[Test]
public void MyTest()
{
...
productsQuery.Verify(x => x.GetByFilter(goodUrlExpression), Times.Once());
}
Но я получаю нулевой ссылочный исключение, как и в первой попытке.
код в мой контроллер как следовать
public ActionResult Detail(string urlRewrite)
{
//Here, during tests, I get the null reference exception
var entity = productQueries.GetByFilter(x => x.UrlRewrite == urlRewrite);
var model = new ProductDetailViewModel() { UrlRewrite = entity.UrlRewrite, Culture = entity.Culture, Title = entity.Title };
return View(model);
}
Вы можете назначить лямбда-выражение переменной и использовать его в настройках и проверка вызовов? –
Не повезло. Обновите вопрос своим предложением – Iridio
Возможно, я не понимаю, что вы пытаетесь сделать, но если вы просто пытаетесь проверить, что настройка была сопоставлена, разве вы не можете просто использовать VerifyAll? – DoctorMick