我正在嘗試模擬以下方法,但updateRefundReqeust回傳null而不是更新的記錄。
public async Task<bool> InvokeAsync(Batch batch)
{
var refundRequests = await this.RefundRequestRepository.GetsAsync(batch.RefundRequests.Select(x => x.Id));
foreach (var getRefundRequest in refundRequests)
{
getRefundRequest.Status = RefundRequestStatus.Closed;
getRefundRequest.LastUpdatedBy = "Test User";
RefundRequest updateRefundReqeust = await UpdateRefund.InvokeAsync(getRefundRequest);
//Returns null instead of updated record
}
}
單元測驗和模擬方法
[Fact]
public async Task Post_Batch()
{
var refundRequests = await this.RefundRequestRepository.GetsAsync(batch.RefundRequests.Select(x => x.Id));
foreach (var getRefundRequest in refundRequests)
{
this.MockUpdateRefund
.Setup(x => x.InvokeAsync(getRefundRequest))
.Returns(async () =>
{
getRefundRequest.Status = RefundRequestStatus.Closed;
getRefundRequest.LastUpdatedBy = Factory.RefundRequest.TestUserName;
return await Task.Run(() => getRefundRequest);
});
}
var postRefund = await PostBatch.InvokeAsync(batch);
//Assert
postRefund.ShouldNotBeNull();
postRefund.IsPosted.ShouldBeTrue();
}
Mocking 中是否遺漏了什么?如果需要更多的東西來支持這個問題,請告訴我。
uj5u.com熱心網友回復:
這里有幾點:
如果所有 Mocked 呼叫都回傳相同的值,則不需要多次設定 Mock。一個安裝程式將以給定的結果為所有呼叫提供服務。
如果您希望模擬依賴項在每次呼叫時回傳不同的固定值,請使用SetupSequence,然后為每個結果鏈接盡可能多的
Returns/ReturnsAsync。但是,看起來您需要攔截引數并對其進行變異,然后回傳它 - 有Returns捕獲引數的多載。對于異步方法,您需要使用ReturnsAsync而不是
Returns. 這兩個都有多載,允許您將傳遞的引數捕獲到模擬方法。您可能不希望使用
Task.Run.Task.FromResult將回傳一個包含結果的任務。您通常不希望在參考型別上進行設定,除非您確定將相同的參考實體傳遞給依賴項,因為如果傳遞了任何其他實體,則 Mock 將被忽略。
It.Is/IsAny可以用作通配符。
我相信您想要以下內容:
this.MockUpdateRefund
.Setup(x => x.InvokeAsync(It.IsAny<RefundRequest>()))
.ReturnsAsync<RefundRequest>((RefundRequest getRefundRequest) =>
{
getRefundRequest.Status = RefundRequestStatus.Closed;
getRefundRequest.LastUpdatedBy = Factory.RefundRequest.TestUserName;
return Task.FromResult(getRefundRequest);
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/483908.html
標籤:C# asp.net 核心 起订量 xunit 最小起订量 3
