簡體   English   中英

最小起訂量與方法不匹配。 Moq.MockException:模擬上的所有調用都必須具有相應的設置

[英]Moq doesn't match methods. Moq.MockException: All invocations on the mock must have a corresponding setup

最小起訂量與模擬方法不匹配。

例外:

拋出異常:Moq.dll 中的“Moq.MockException”:“IMongoRepository.FindByVrcId("b4cb3139-90aa-4477-979b-d893e3317386") 調用失敗,模擬行為嚴格。 模擬上的所有調用都必須具有相應的設置。

這是我的單元測試:

public class OfferHandlerTest : TestBase
{
    Mock<IMongoRepository> repositoryMock = new Mock<IMongoRepository>(MockBehavior.Strict);
    OfferHandler? offerHandler;

    [Fact]
    public void HandleTest()
    {
        JObject? offerFullDocument = null;
        using (var sr = new StreamReader("Data/offer_full_document.json"))
        {
            var reader = new JsonTextReader(sr);
            offerFullDocument = JObject.Load(reader);
        }

        var kafkaPayload = new KafkaMessagePayloadSourceConnector();
        kafkaPayload.OperationType = Constants.Mongo_OperationType_Update;
        kafkaPayload.FullDocument = offerFullDocument;

        OfferService service = new OfferService(repositoryMock.Object);
        offerHandler = new OfferHandler(service, this.ServiceConfiguration);

        offerHandler.Handle(kafkaPayload);

        DHOffer offer = new DHOffer();
        offer.Version = 1;

        // THIS SETUP FAILS
        repositoryMock.Setup(s => s.FindByVrcId<DHOffer>(It.IsAny<string>())).Returns(It.IsAny<DHOffer>());

        repositoryMock.Verify(s => s.FindAndUpdate<DHOffer>(It.IsAny<DHOffer>()), Times.Once);
    }
}

這是句柄方法:

public void Handle(KafkaMessagePayloadSourceConnector kafkaPayload)
{
    VRCOffer offer = kafkaPayload!.FullDocument!.ToObject<VRCOffer>()!;

    if (kafkaPayload!.OperationType!.Equals(Constants.Mongo_OperationType_Update))
    {
        offerService.updateOfferStatus(OfferMapper.MapToDataHubModel(offer), offer.MasterId);
    }
}

最后是服務方法:

public class OfferService
{
    private readonly IMongoRepository offerRepository;

    public OfferService(IMongoRepository offerRepository)
    {
        this.offerRepository = offerRepository;
    }
    
    internal void updateOfferStatus(DHOffer offer, string vrcMasterId)
    {
        // THIS SHOULD RETURN MOCKED OBJECT
        DHOffer existingOffer = offerRepository.FindByVrcId<DHOffer>(vrcMasterId);
        existingOffer.ModifiedDate = DateTime.Now.ToString();
        existingOffer.AdditionalInformation.Status = offer?.AdditionalInformation?.Status!;

        offerRepository.FindAndUpdate(existingOffer);
    }
}

我嘗試在Return()方法中使用It.IsAny<DHOffer>()但我得到了相同的異常。

您的問題是您在使用模擬 object運行最小起訂量設置。 到那時已經太晚了。 您只需要在開始時運行.Setup(...)命令。

還值得注意的是,如果多個測試需要不同的設置,則使用共享模擬可能會出現問題。 有些工具可以並行運行測試,這可能會把事情搞砸,或者以不同的順序運行,這可能會導致事情變得更脆弱。

暫無
暫無

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

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