【问题标题】:Can I use FakeItEasy to fake Properties.Settings.Default properties?我可以使用 FakeItEasy 来伪造 Properties.Settings.Default 属性吗?
【发布时间】:2014-07-21 16:44:32
【问题描述】:

我正在尝试做类似于A.CallTo(() => MyProject.Properties.Settings.Default.SomeProperty).Returns("Hello, World! ;-)"); 的事情,但我确实得到了……

非虚方法不能被拦截。

……作为回报。

有什么想法吗?

【问题讨论】:

    标签: c# testing mocking stub fakeiteasy


    【解决方案1】:

    FakeItEasy 不能用于覆盖SomeProperty。问题是DefaultSettings 类型的成员,它是sealed 类。为了能够将A.CallToDefault.SomeProperty 一起使用,Default 必须是使用A.Fake<…> 创建的假对象。

    此外,SomeProperty 需要是虚拟的或以其他方式被覆盖,如文档的 What can be faked 页面所示。​​

    如果您需要能够在测试中提供虚假配置,您可以围绕配置引入一个抽象层,然后在您的生产代码中使用委托给 MyProject.Properties.Settings 的具体类来伪造它……

    另一种选择(我认为更好)是完全避免伪造/模拟,直接更改设置,也许通过执行以下操作:

    MyProject.Properties.Settings.Default.SomeProperty= "Hello, World! ;-)"
    

    尽管正如 cmets 中所指出的,这只是一个选项,如果属性有一个 setter,看起来 Application 属性没有,但 User 属性有。

    【讨论】:

    • 感谢您的回复。我认为您在最后一行中遗漏了一些代码?
    • 谢谢,@exalted。我很容易分心。忘记了复制/粘贴/修改的“修改”部分……
    • 谢谢布莱尔,这很有意义! ;-)
    • 好吧,这太快了。不幸的是 SomeProperty 没有二传手。 ;-(
    • 啊。在阅读您的问题之前,我从未使用过项目设置。当我将它们添加到我周围的项目中时,我必须创建一个“用户”属性,它有一个设置器。你的是“应用程序”设置?在这种情况下,如果您不能只更改初始值(因为您想使用不同的值进行测试),我建议您添加一个抽象层。