【问题标题】:Modifying mock property which has been set up修改已设置的模拟属性
【发布时间】:2017-11-25 11:45:00
【问题描述】:

我将把问题简化一点:

在我的测试中,我使用了一个模拟对象(我模拟了它,因为它调用了一个 bdd),我将参数提供给另一个对象(未模拟)的方法,其目的是修改这个模拟对象的属性。

ModifyingClass myModifyingClass = new ModifyingClass();
Mock<ToModifyClass> mockedClass = new Mock<ToModifyClass>();
mockedClass.Setup(mc => mc.name).Returns("Test1");
myModifyingClass.modify(mockedClass.Object);

方法modify然后尝试设置模拟对象的属性名称,但它不起作用,所以也许这是正常行为但我真的需要测试所有这些是否有效以及方法@987654324是否有效@根据需要设置属性。

【问题讨论】:

  • 运行测试时会发生什么?错误发生在哪里?
  • 这是什么模拟库?无论如何,如果您想像使用真实属性一样使用该属性,则不应对该属性进行存根 - 具体操作方式取决于库。
  • 贾尼斯。 S.我调试测试没有错误发生,只是属性没有被修改。
  • 你怎么知道它没有被修改,你有断言语句吗?
  • 请看这里:stackoverflow.com/questions/16816551/…,您需要调用 SetupAllProperties()

标签: c# unit-testing mocking moq


【解决方案1】:

如 cmets 中所述,您需要以不同方式设置模拟类以保留传递给属性的值。

参考Moq - Quickstart

存根模拟上的所有属性(在 Silverlight 上不可用):

mock.SetupAllProperties();

提供的示例测试看起来像...

//Arrange
var myModifyingClass = new ModifyingClass();
var mockedClass = new Mock<ToModifyClass>();
mockedClass.SetupAllProperties(); //<-- this will allow property changes to be retained.
var model = mockedClass.Object;
//set the property now that it can be set
model.name = "Test1";
var expected = "expected value here";

//Act
myModifyingClass.modify(model);

//Assert
var actual = model.name;
Assert.AreEqual(expected, actual);
//... other assertions

【讨论】:

    【解决方案2】:

    在起订量中需要设置吸气剂。

    mockedClass.SetupGet(mc => mc.name).Returns("Test1");
    

    【讨论】:

    • 它也不起作用,我想我得到了“Test1”,即使我因为 setup/setupget 设置了属性。我终于不打算自己使用setup和设置属性了,这样就可以了,非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多