我不懂犀牛戏法,所以我可能完全错过了一些东西。
假设我有一个接口,它有六个属性:
public interface IFoo {
string Foo1 { get; }
string Foo2 { get; }
string Foo3 { get; }
string Foo4 { get; }
int Foo5 { get; }
int Foo6 { get; }
}
以及一个实现,该实现采用类似的对象,但没有相同的约束,并创建一个ifoo实例:
public interface IFooLikeObject {
string FooLikeObject1 { get; }
string FooLikeObject2 { get; }
string FooLikeObject3 { get; }
string FooLikeObject4 { get; }
string FooLikeObject5 { get; }
string FooLikeObject6 { get; }
}
public class Foo : IFoo {
public Foo(IFooLikeObject fooLikeObject) {
if (string.IsNullOrEmpty(fooLikeObject.Foo1)) {
throw new ArgumentException("fooLikeObject.Foo1 is a required element and must not be null.")
}
if (string.IsNullOrEmpty(Foo2)) {
throw new ArgumentException("fooLikeObject.Foo2 is a required element and must not be null")
}
}
}
现在,在我的测试中,我想测试在适当的时间抛出异常,以及在从字符串到int的转换失败时抛出的异常。
因此,我需要截取ifoolikeObject,以返回当前未测试的值的有效值,因为我不想在每个测试方法中重复此代码,所以将其提取到单独的方法中。
public IFooLikeObject CreateBasicIFooLikeObjectStub(MockRepository mocks) {
IFooLikeObject stub = mocks.Stub<IFooLikeObject>();
SetupResult.For(stub.FooLikeObject1).Return("AValidString");
SetupResult.For(stub.FooLikeObject2).Return("AValidString2");
SetupResult.For(stub.FooLikeObject5).Return("1");
SetupResult.For(stub.FooLikeObject6).Return("1");
}
这对于测试foo3和foo4来说已经足够好了,但是当测试foo1、2、5或6时,我得到:
System.InvalidOperationException : The result for IFooLikeObject.get_FooLikeObject1(); has already been setup. Properties are already stubbed with PropertyBehavior by default, no action is required
例如:
[Test]
void Constructor_FooLikeObject1IsNull_Exception() {
MocksRepository mocks = new MocksRepository();
IFooLikeObject fooLikeObjectStub = CreateBasicIFooLikeObjectStub(mocks);
SetupResult.For(fooLikeObjectStub.FooLikeObject1).Return(null);
mocks.ReplayAll();
Assert.Throws<ArgumentException>(delegate { new Foo(fooLikeObjectStub); });
}
如何设置它,以便我可以重写已经设置了返回值的单个属性,而不必重新执行所有其他属性?