FakeItEasy属性getter调用规则未触发

时间:2016-05-15 21:36:37

标签: c# fakeiteasy

我试图让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);
}

1 个答案:

答案 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());