我试图让FakeItEasy 1.25.3在一个属性上抛出异常; setter测试工作正常,但getter不会像预期的那样抛出异常。我究竟做错了什么?
public interface IMisc
{
int IntProperty { get; set; }
}
// Setter throws exception as expected.
[Test]
public void Property_Setter_Throws()
{
var driver = A.Fake<IMisc>();
A.CallTo(driver).Where(call => call.Method.Name == "set_IntProperty")
.Throws(new Exception());
var i = driver.IntProperty;
Assert.That( delegate { driver.IntProperty = 3; }, Throws.Exception);
}
// Getter does not throw exception as expected.
[Test]
public void Property_Getter_Throws()
{
var driver = A.Fake<IMisc>();
A.CallTo(driver).Where(call => call.Method.Name == "get_IntProperty")
.Throws(new Exception());
driver.IntProperty = 3;
Assert.That(delegate { var i = driver.IntProperty; }, Throws.Exception);
}
答案 0 :(得分:2)
这是这一行:
X is 2 * 2.
导致您的问题。它的作用基本上是配置getter在调用时返回值3.
这是因为driver.IntProperty = 3;
是一个读/写属性。有关详细信息,请参阅this。
从上面的链接引用:
虽然您可以显式指定被调用属性getter的返回值,但是有一种更简单,更直观的方式来处理读/写属性。默认情况下,任何具有set和get访问器的可伪造属性都会像您期望的那样运行。设置值然后获取值将返回已设置的值。
此外,请注意,由于修复了,您看到的行为将随FakeItEasy 2.0而改变
magic property get followed by another get returns different object when property type is not fakeable。
有了这个改变,你的两个测试就会以同样的方式失败 - IntProperty
也会失败,因为使用Property_Setter_Throws
的getter会使FakeItEasy在将来返回相同的返回值实例(它正在设置一个自动属性规则。)
作为可能在将来帮助您的更多信息,您可能喜欢使用类型安全方法来设置属性行为:
driver.IntProperty
可以成为
A.CallTo(driver).Where(call => call.Method.Name == "get_IntProperty")
.Throws(new Exception());
(在FakeItEasy 2.0中,有a similar method for configuring 属性设置者):
A.CallTo(() => driver.IntProperty).Throws(new Exception());