簡體   English   中英

如何使用 Moq 在 .NET 6 的以下代碼中模擬方法?

[英]How to mock methods in the below code in the .NET 6 using Moq?

下面是需要測試的InvokeAsync方法。

    public async Task<bool> InvokeAsync(Batch batch)
    {
        var refundRequests = await this.RefundRepository.GetsAsync(batch.RefundRequests.Select(x => x.Id));

        refundRequests.RemoveAll(x => x.Status != RefundRequestStatus.Approved);
        var distributions = await DistributionRepository.GetsAsync(refundRequests.Select(x => x.Distribution.Id));

        var bundles = await this.BundleRepository.GetsAsync(distributions.Select(x => x.BundleId));

        foreach (var getRefundRequest in refundRequests)
        {
            var distribution = distributions.FirstOrDefault(x => x.Id == getRefundRequest.Distribution.Id);

            if (distribution?.BundleId != null)
            {
                var bundle = bundles.First(x => x.Id == distribution?.BundleId);

                Bundle result = await Reverse.InvokeAsync(getRefundRequest, distribution, bundle); //MOCK
            }
            getRefundRequest.Status = RefundRequestStatus.Closed;
            getRefundRequest.LastUpdatedBy = "Test User";

            bool isUpdated = await UpdateRefund.InvokeAsync(getRefundRequest); //MOCK
        }

        batch.Status = BatchStatus.Posted;
        batch.LastUpdatedBy = "Test User";
        var isSuccess = await UpdateBatch.InvokeAsync(batch); //MOCK

        return isSuccess;
    }

單元測試方法

[Fact]
public async Task Post_Batch()
{
    foreach (var refundBatch in Factory.Batch.CreateRefundBatchesData())
    {
        var refundRequests = await this.RefundRequestRepository.GetsAsync(batch.RefundRequests.Select(x => x.Id));
        var distributions = await this.DistributionRepository.GetsAsync(refundRequests.Select(x => x.Distribution.Id));
        var bundles = await this.BundleRepository.GetsAsync(distributions.Select(x => x.BundleId));

        for (int i = 0; i < refundRequests.Count; i++)
        {
            var refundRequest = refundRequests[i];
            var bundle = bundles[i];
            var distribution = distributions[i];
            MockSetupReverse(refundRequest, distribution, bundle);
            MockSetupUpdateRefund(refundRequest);
        }

        MockSetupUpdateBatch(batch);

        //Act
        var postRefund = await UseCase.InvokeAsync(batch);

        //Assert
        postRefund.ShouldNotBeNull();
        postRefund.IsPosted.ShouldBeTrue();
    }
}

模擬設置方法

private void MockSetupReverse(RefundRequest refundRequest, Distribution distribution, Bundle bundle)
{
    this.MockReverse
        .Setup(x => x.InvokeAsync(refundRequest, distribution, bundle))
        .Returns(async () => 
        {
            bundle.Status = BundleStatus.Closed;
            return await Task.Run(() => bundle); 
        });
}

private void MockSetupUpdateRefund(RefundRequest refundRequest)
{
    this.MockUpdateRefund
            .Setup(x => x.InvokeAsync(refundRequest))
            .Returns(async () =>
            {
                refundRequest.Status = RefundRequestStatus.Closed;
                refundRequest.LastUpdatedBy = Factory.RefundRequest.TestUserName;
                return await Task.Run(() => true);
            });
}

private void MockSetupUpdateBatch(Batch batch)
{
    this.MockUpdateBatch
            .Setup(x => x.InvokeAsync(batch))
            .Returns(async () =>
            {
                refundBatch.Status = BatchStatus.Posted;
                refundBatch.LastUpdatedBy = Factory.RefundRequest.TestUserName;
                return await Task.Run(() => true);
            });
}

UpdateBatch的模擬正在工作,並在調用該方法時返回true 但是,當調用相應的方法時, ReverseUpdateRefund的模擬返回false 有什么想法嗎?

如果需要更多信息來支持該問題,請告訴我。

當您使用特定參數Setup模擬時, Returns值僅在使用此特定參數時適用。

UpdateBatch起作用的原因是因為您在模擬和被測類中都使用了對相同Batch的相同引用:

MockSetupUpdateBatch(batch);

//Act
var postRefund = await UseCase.InvokeAsync(batch); // <---- Same "batch"

當您的測試代碼調用RefundRequestRepository.GetsAsync時,您可能會得到與測試類調用GetsAsync不同的結果,因此設置與測試類的調用無關,並且可能返回默認布爾值 ( false )。

有關如何正確模擬的更多信息,請參閱此 GitHub 頁面

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM