web-dev-qa-db-ja.com

moqオブジェクトはメソッドを返します。nullオブジェクトを返す必要があります

私はWeb APIを開発していますが、私が思いついたテストの1つは、クライアントが物理テスト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)
}

Nullオブジェクトを返すには、Returns()メソッドが必要です。これは、リソースが見つからない場合に実際のAPIメソッドが返すものになります。

Returns()メソッドのパラメーターとしてnullを送信しようとしましたが、成功しませんでした。

61
Daniel

エラーが何であるかを示すことはできませんが、これは機能するはずです。

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

Returnsがオーバーロードされており、どのメソッドを呼び出すべきかわからないため、コンパイラが文句を言うReturns(null)で呼び出そうとしたのではないかと思います。特定の型にキャストすると、あいまいさがなくなります。

174
Jeff Ogata

rtはメソッドの戻り型です:FindById

repository.Setup(r => r.FindById(It.IsAny<int>())).Returns(Task.FromResult((rt)null));

2
Radhika Patwari