我正在尝试使用FakeItEasy来模拟一个我正在创建的C#类成员的对象。
FakeItEasy文档表明您以与此类似的方式伪造对象:
private static var m_physics = A.Fake<IPhysics>();
即使用“var”关键字。
但是,在这种情况下,C#编译器不喜欢 var 在非本地上下文中使用的事实。我收到这个错误:
上下文关键字'var'可能只出现在本地变量声明
中我不能模拟一个不是本地的对象吗?
答案 0 :(得分:6)
我认为你错过了模拟/存根的重点。当您不希望受测试的主体通过或失败时,模拟和存根用于测试,具体取决于它所依赖的其他组件。所以你要做的就是将这些外部的显式实现交换为这些依赖项的mocks / stub,你可以在测试中完全控制它们。
class Foo {
public Foo(IBar bar) { }
public object M() { // do something with IBar }
}
此处Foo
依赖于IBar
。我们想测试Foo.M
。根据我们提供给Foo
的{{1}}的具体实现是否有效,我们不希望测试通过或失败。
IBar
如果[Fact]
public void MDoesWhatItIsSupposeToDo() {
var foo = new Foo(new Bar());
object expected = // expected result
Assert.Equal(expected, foo.M());
}
被破坏,即使Bar
可能被正确编码,此测试也可能失败。所以你在模拟/存根中加入来预防这个
Foo
现在,如果[Fact]
public void MDoesWhatItIsSupposeToDo() {
var bar = A.Fake<IBar>();
// set up bar to do what is expected of IBars
var foo = new Foo(bar);
object expected = // expected result
Assert.Equal(expected, foo.M());
}
编码正确与否,此测试只会通过或失败,而与Foo
的具体实现是否正确无关。
这是嘲笑的重点。
所有这一切都是说,你没有正确使用模拟。
我不能模拟一个不是本地的对象吗?
你可以,但不是以你正在做的方式。首先,不能隐式输入字段。其次,你不要像你那样明确地模仿这个领域。相反,你这样做:
IBar
然后:
class Whatever {
private IPhysics m_physics;
public Whatever(IPhsyics physics) { this.m_physics = physics; }
}
答案 1 :(得分:0)
您只能在本地上下文中使用'var'关键字,例如功能块。您不能将类成员声明为'var'。