检查是否已调用属性setter

时间:2014-07-19 12:26:21

标签: rhino-mocks rhino-mocks-3.5

我有一个类我是单元测试,我想做的就是验证公共setter是否在属性上被调用。关于如何做到这一点的任何想法?

我不想检查是否设置了一个值来证明它已被调用。我只想确保构造函数使用公共setter。请注意,此属性数据类型是原始字符串

1 个答案:

答案 0 :(得分:0)

这不是因为您尝试测试实现细节而设计的模拟方案。现在,如果此属性位于原始类通过接口访问的其他类上,您将模拟该接口并使用IgnoreArguments语法设置期望:

public interface IMyInterface
{
    string MyString { get; set; }
}

public class MyClass
{
    public MyClass(IMyInterface argument)
    {
        argument.MyString = "foo";
    }
}

[TestClass]
public class Tests
{
    [TestMethod]
    public void Test()
    {
        var mock = MockRepository.GenerateMock<IMyInterface>();
        mock.Expect(m => m.MyString = "anything").IgnoreArguments();
        new MyClass(mock);
        mock.VerifyAllExpectations();
    }
}

您尝试做的事情有两个问题。第一个是你试图模拟一个具体的类,所以你只能设置期望,如果属性是虚拟的。

第二个问题是您要测试的事件发生在构造函数中,因此在创建模拟时会发生,因此在您设置任何期望之前就会发生。

如果类没有被密封,并且属性是虚拟的,你可以通过创建自己的派生类来测试这个,而不是模拟,例如:

public class RealClass
{
    public virtual string RealString { get; set; }

    public RealClass()
    {
        RealString = "blah";
    }
}

[TestClass]
public class Tests
{
    private class MockClass : RealClass
    {
        public bool WasStringSet;

        public override string RealString
        {
            set { WasStringSet = true; }
        }
    }

    [TestMethod]
    public void Test()
    {
        MockClass mockClass = new MockClass();
        Assert.IsTrue(mockClass.WasStringSet);
    }
}