我正在尝试使用 FakeItEasy 来模拟一个对象,该对象是我正在创建的 C# 类的成员。
FakeItEasy 文档表明您以类似于以下方式伪造对象:
private static var m_physics = A.Fake<IPhysics>();
也就是说,使用“var”关键字。
但是,在这种情况下,C# 编译器不喜欢在非本地上下文中使用var的事实。我收到此错误:
上下文关键字“var”只能出现在局部变量声明中
我不能模拟一个不是本地的对象吗?
我正在尝试使用 FakeItEasy 来模拟一个对象,该对象是我正在创建的 C# 类的成员。
FakeItEasy 文档表明您以类似于以下方式伪造对象:
private static var m_physics = A.Fake<IPhysics>();
也就是说,使用“var”关键字。
但是,在这种情况下,C# 编译器不喜欢在非本地上下文中使用var的事实。我收到此错误:
上下文关键字“var”只能出现在局部变量声明中
我不能模拟一个不是本地的对象吗?
我认为你错过了模拟/存根的意义。当您不希望被测对象根据它所依赖的其他组件通过或失败时,模拟和存根用于测试。因此,您要做的是将这些显式实现换成这些依赖项的模拟/存根,您可以在测试中完全控制这些依赖项。
class Foo {
public Foo(IBar bar) { }
public object M() { // do something with IBar }
}
这里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());
}
如果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; }
}
然后:
var physics = A.Fake<IPhysics>();
var whatever = new Whatever(physics);
您只能在本地上下文(如功能块)中使用“var”关键字。您不能将类成员声明为“var”。