检查是否调用了属性setter



我有一个类,我正在进行单元测试,我想做的就是验证公共setter是否在属性上被调用。有什么办法吗?

我不想检查是否设置了一个值来证明它被调用了。我只想确保构造函数正在使用公共设置器。注意,这个属性数据类型是一个基本字符串

这不是mock设计的那种场景,因为您正在尝试测试实现细节。现在,如果该属性位于原始类通过接口访问的另一个类上,则可以模拟该接口并使用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();
    }
}

你想做的事情有两个问题。第一种情况是,您试图模拟一个具体类,因此您只能在属性是虚拟的情况下设置期望。

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

如果类不是密封的,并且属性是virtual,您可以通过创建自己的派生类来测试,而不需要mock,例如:

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);
    }
}

最新更新