我有一门课,我正在单元测试,我想做的就是验证公共 setter 是否在属性上被调用。关于如何做到这一点的任何想法?
我不想检查是否设置了一个值来证明它被调用了。我只想确保构造函数使用 public setter 。请注意,此属性数据类型是原始字符串
我有一门课,我正在单元测试,我想做的就是验证公共 setter 是否在属性上被调用。关于如何做到这一点的任何想法?
我不想检查是否设置了一个值来证明它被调用了。我只想确保构造函数使用 public setter 。请注意,此属性数据类型是原始字符串
这不是模拟设计的那种场景,因为您正在尝试测试实现细节。现在,如果此属性位于与通过接口访问的原始类不同的类上,您将模拟该接口并使用以下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);
}
}