【问题标题】:How to return a value from a void method using Mock setup如何使用 Mock 设置从 void 方法返回值
【发布时间】:2014-02-20 21:06:30
【问题描述】:

如何使用 Mock 回调从 void 方法返回值

在我的单元测试中,我必须模拟对 DB 写入调用方法的调用。此方法是 void 类型,但对于我的测试断言,我需要验证传递给此方法的参数之一。 有没有办法在模拟设置中返回这个参数?

这是我的代码。

public virtual void InsertOrUpdateBrewedEntity(RawDataLeaf theRawData, //this parameter i want to check for assertion
                                                  XsdInfo allXsdInfo = null,
                                                  DbWritingActionCode actionCode = DbWritingActionCode.I,
                                                  Dictionary<string, string> dataIdMap = null,
                                                  Action<string, RawDataLeaf> testActionToDoInsteadOfWriting = null,
                                                  string transactionName = null,
                                                  bool skipValidationEvenForTypesThatCantSaveIfNotValid = false,
                                                  bool disableExtraSqlForXsdType = false,
                                                  string nameOverride = null)
    {
        //code
    }

所以我想在模拟方法设置中获取 RawDataLeaf theRawData 对象的值。

这是我设置这个模拟方法调用的方法。

_xmlCupboardWriteAccess.Setup(x => x.InsertOrUpdateBrewedEntity(It.IsAny<RawDataLeaf>(),
                                                                 It.IsAny<XsdInfo>(),
                                                                 It.IsAny<DbWritingActionCode>(),
                                                                 It.IsAny<Dictionary<string, string>>(),
                                                                 It.IsAny<Action<string, RawDataLeaf>>(),
                                                                 It.IsAny<string>(),
                                                                 It.IsAny<bool>(),
                                                                 It.IsAny<bool>(),
                                                                 It.IsAny<string>()));

【问题讨论】:

  • 你不能从 void 返回数据,这就是它的意思。您也许可以使用 out (msdn.microsoft.com/en-us/library/t3c3bfhx.aspx) 关键字。
  • @Bonzo 我希望有一个不需要我更改我正在模拟的方法签名的解决方案。作为 QA,我可以编写测试但不能更改已实现的代码。不过谢谢你的建议。

标签: c# unit-testing moq


【解决方案1】:

听起来您只是在验证是否使用特定值调用了该方法,因此请在您的 Verify 调用中使用 It.Is&lt;&gt;

_xmlCupboardWriteAccess.Verify(x => x.InsertOrUpdateBrewedEntity(
    It.Is<RawDataLeaf>(actualRawDataLeaf => /* your equality test */),
    It.IsAny<XsdInfo>(),
    // ... etc

【讨论】:

  • 按照您建议的方式实施,但出现异常“预期在模拟上至少调用一次,但从未执行”
  • @RahulLodha 您仍然需要拨打您的问题中的Setup。这只是验证它是使用正确的参数调用的。
【解决方案2】:

moq.Verify() 将为您完成这项工作。

https://github.com/Moq/moq4/wiki/Quickstart

// 至少调用一次 mock.Verify(foo => foo.Execute("ping"), Times.AtLeastOnce());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-28
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2015-10-03
    • 2011-08-02
    • 2016-02-12
    相关资源
    最近更新 更多