Moq与虚拟属性和参数构造函数的行为

时间:2013-10-23 11:39:13

标签: c# unit-testing moq

在使用参数化构造函数模拟对象时,如果在构造函数中初始化的属性是虚拟的,则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失败。预期:。实际:≤(NULL)&GT;

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

由于Entity Framework,我必须将属性保持为虚拟。

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

1 个答案:

答案 0 :(得分: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);
    }