【问题标题】:Moq behaviour with virtual property and parameter constructor具有虚拟属性和参数构造函数的最小起订量行为
【发布时间】:2013-11-01 15:58:34
【问题描述】:

在使用参数化构造函数模拟对象时,如果在构造函数中初始化的属性是虚拟的,则 Moq 不会设置属性值。但如果是非虚拟属性,则 Moq 设置值。

以下是我要模拟的课程。

public class Activity
{
    private Activity() {}
    public Activity(string code, string description, string option)
    {
        if(string.IsNullOrEmpty(code)) throw  new ArgumentNullException("code");
        if (string.IsNullOrEmpty(option)) throw new ArgumentNullException("option");

        Code = code;
        Description = description;
        Option = option;
    }

    public virtual string Code { get; private set; }
    public virtual string Description { get; private set; }
    public virtual string Option { get; private set; }

}

这就是我尝试模拟它的方式:

    [TestMethod]
    public void It_Creates_Mock_For_A_Class()
    {
        var mock = new Mock<Activity>("Code 1", null, "Option");
        Assert.IsNotNull(mock.Object);
        Assert.AreEqual("Code 1", mock.Object.Code);
    }

测试方法失败说: Assert.AreEqual 失败。预期的:。实际:.

但如果我从所有属性中删除 virtual 关键字,它会起作用并通过测试用例。

由于实体框架,我必须保持虚拟属性。

有什么线索吗?如何解决这个问题?

【问题讨论】:

  • 实际上,您的测试测试的是 MOQ 框架,而不是测试您的构造函数实现。你想测试什么?您只询问奇怪的起订量行为吗?
  • @IlyaPalkin 以上只是一个示例,用于演示在虚拟/非虚拟财产的情况下我在使用起订量时遇到的问题。由于这个问题,我尝试编写的许多行为测试用例都失败了,因为 Activity 类的私有方法在内部使用这些属性并发现它们为空。

标签: c# unit-testing moq


【解决方案1】:

发现如果“CallBase”属性设置为true,问题就解决了。

通过查看对象浏览器中的程序集,总结说:

总结: 如果没有匹配的设置,是否将为模拟类调用基本成员虚拟实现。默认为 false。

有效的代码:

    [TestMethod]
    public void It_Creates_Mock_For_A_Class()
    {
        var mock = new Mock<Activity>("Code 1", null, "Option");
        mock.CallBase = true;
        Assert.IsNotNull(mock.Object);
        Assert.AreEqual("Code 1", mock.Object.Code);
    }

【讨论】:

  • 我没用过'mock.CallBase = true;'以前,但这是我将来肯定会使用的东西。无论如何,我认为还有其他更好的解决方案。
  • @IlyaPalkin 能否分享一下更好的解决方案。
  • 如果您测试一个依赖于“Activity”的类,那么您将创建“Mock”并设置其公共属性或方法。在这种情况下,被测单元是该类的一个实例。 如果您测试“活动”,那么您应该测试一个“活动”类型的实例。所有私有方法通常都通过公共方法进行测试。
  • 这正是解决了我的问题的方法,同时仍然允许我在事后进行一些额外的设置。应该是公认的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多