Bug*_*boy 0 c# var mocking fakeiteasy
我正在尝试使用FakeItEasy来模拟一个对象,该对象是我正在创建的C#类的成员.
FakeItEasy文档表明您以与此类似的方式伪造对象:
private static var m_physics = A.Fake<IPhysics>();
Run Code Online (Sandbox Code Playgroud)
也就是说,使用"var"关键字.
但是,在这种情况下,C#编译器不喜欢var在非本地上下文中使用的事实.我收到此错误:
上下文关键字'var'可能只出现在局部变量声明中
我不能模拟一个不是本地的对象吗?
我想你错过了模拟/存根的重点.当您不希望受测试的主体通过或失败时,模拟和存根用于测试,具体取决于它所依赖的其他组件.所以你要做的就是将这些外部的显式实现交换为这些依赖项的mocks/stub,你可以在测试中完全控制它们.
class Foo {
public Foo(IBar bar) { }
public object M() { // do something with IBar }
}
Run Code Online (Sandbox Code Playgroud)
这里Foo依赖于IBar.我们想测试一下Foo.M.我们不希望测试通过或失败是与否,我们给的具体实施Foo的IBar工作或没有.
[Fact]
public void MDoesWhatItIsSupposeToDo() {
var foo = new Foo(new Bar());
object expected = // expected result
Assert.Equal(expected, foo.M());
}
Run Code Online (Sandbox Code Playgroud)
如果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());
}
Run Code Online (Sandbox Code Playgroud)
现在,如果Foo编码正确与否,此测试只会通过或失败,无论您的具体实现IBar是否正确.
这是嘲笑的重点.
所以这就是说,你没有正确使用模拟.
我不能模拟一个不是本地的对象吗?
你可以,但不是以你正在做的方式.首先,不能隐式输入字段.其次,你不要像你那样明确地模仿这个领域.相反,你这样做:
class Whatever {
private IPhysics m_physics;
public Whatever(IPhsyics physics) { this.m_physics = physics; }
}
Run Code Online (Sandbox Code Playgroud)
然后:
var physics = A.Fake<IPhysics>();
var whatever = new Whatever(physics);
Run Code Online (Sandbox Code Playgroud)