【发布时间】:2014-07-21 16:44:32
【问题描述】:
我正在尝试做类似于A.CallTo(() => MyProject.Properties.Settings.Default.SomeProperty).Returns("Hello, World! ;-)"); 的事情,但我确实得到了……
非虚方法不能被拦截。
……作为回报。
有什么想法吗?
【问题讨论】:
标签: c# testing mocking stub fakeiteasy
我正在尝试做类似于A.CallTo(() => MyProject.Properties.Settings.Default.SomeProperty).Returns("Hello, World! ;-)"); 的事情,但我确实得到了……
非虚方法不能被拦截。
……作为回报。
有什么想法吗?
【问题讨论】:
标签: c# testing mocking stub fakeiteasy
FakeItEasy 不能用于覆盖SomeProperty。问题是Default 是Settings 类型的成员,它是sealed 类。为了能够将A.CallTo 与Default.SomeProperty 一起使用,Default 必须是使用A.Fake<…> 创建的假对象。
此外,SomeProperty 需要是虚拟的或以其他方式被覆盖,如文档的 What can be faked 页面所示。
如果您需要能够在测试中提供虚假配置,您可以围绕配置引入一个抽象层,然后在您的生产代码中使用委托给 MyProject.Properties.Settings 的具体类来伪造它……
另一种选择(我认为更好)是完全避免伪造/模拟,直接更改设置,也许通过执行以下操作:
MyProject.Properties.Settings.Default.SomeProperty= "Hello, World! ;-)"
尽管正如 cmets 中所指出的,这只是一个选项,如果属性有一个 setter,看起来 Application 属性没有,但 User 属性有。
【讨论】:
SomeProperty 没有二传手。 ;-(