Moq에서 식을 사용하는 메서드 호출을 설정하고 확인하는 방법이 있습니까? 두 번째는 "패치"할 수는있을Moq를 사용하여 식 설정 및 확인
첫 번째 시도는, 내가 그것을 얻이하고 싶은 것입니다
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
부품 작품 테스트는 Assert
에서 실패하고 null 참조 예외가 발생합니다. GetByFilter 메서드가 호출되지 않기 때문입니다.
대신하면 나는이
[Setup]
public void SetUp()
{
productsQuery.Setup(x => x.GetByFilter(It.IsAny<Expression<Func<Product, bool>>>())).Returns(new Product() { Title = "Good product", ... });
}
테스트가 어설 부분을 통과 사용하지만, 이번에는 그가 호출되지 않습니다 말하는 실패 확인입니다.
generic It.IsAny<>()
을 사용하는 대신 특정 식으로 메서드 호출을 설정하는 방법이 있습니까?
업데이트
나는 코멘트에 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());
}
을 생성하지만 첫 번째 시도에서와 같이 null 참조 예외를 얻을. 다음 코드는 시나리오에서 테스트하는 방법을 보여줍니다
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