moq objects返回方法,应返回一个空对象


76

我正在开发Web API,我想出的一项测试是,如果客户端使用物理测试ID(物理测试是我正在寻找的资源)进行GET操作,但找不到该物理测试,则Web API应该返回404状态。

现在,我正在使用moq框架进行测试,并且具有以下代码:

[TestMethod]
public void then_if_physical_test_not_found_return_not_found_status()
{
    var unitOfWork = new Mock<IUnitOfWork>();
    var repository = new Mock<IRepository<PhysicalTest>>();
    repository.Setup(r => r.FindById(It.IsAny<int>())).Returns();
    unitOfWork.Setup(m => m.PhysicalTests).Returns(repository.Object);
    var pt = new PhysicalTestResource(unitOfWork.Object);
    HttpResponseMessage<PhysicalTest> response = pt.GetPhysicalTest(43);
    Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode)
}

我需要Return()方法来返回一个空对象,这将是如果找不到资源则实际API方法将返回的对象。

我尝试在Return()方法中将null作为参数发送,但没有成功。

Answers:


219

您没有指出错误是什么,但这应该可以解决:

unitOfWork.Setup(m => m.PhysicalTests).Returns((IRepository<PhysicalTest>)null);

我怀疑您尝试使用调用它Returns(null),由于Returns重载并且不知道应调用哪个方法,这会导致编译器抱怨。强制转换为特定类型可以消除歧义。


7
它起作用了,但我必须进行以下修改:unitOfWork.Setup(m => m.PhysicalTests).Returns((PhysicalTest)null);
丹尼尔(Daniel)

1
啊,好吧...我以为是因为您试图返回repository.Object的类型就是PhysicalTests
杰夫·绪方

我尝试了同样的事情,并且得到了System.NotSupportedException。{“在非虚拟(在VB中可重写)成员上的无效设置:x => x.GetFoo(.value.Id)”}有什么想法吗?
Dan Csharpster

@DanCsharpster您只能在具有虚拟成员的接口或抽象类上使用Moq。无论您使用的x是哪种类,它都是具有GetFoo()非虚拟/可覆盖性的具体类或抽象类。
bcr

1
我可以推荐这种解决过载歧义的方法。我只想提到,由于这两个非泛型重载在Returns这里很重要,它们的参数名称不同,因此您还可以通过以下方式解决歧义:(... .Returns(value: null)这里value只是我们想要的重载中参数的名称,它不是关键字)。
杰普·斯蒂格·尼尔森

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.