0

我正在尝试使用 FakeItEasy 来模拟一个对象,该对象是我正在创建的 C# 类的成员。

FakeItEasy 文档表明您以类似于以下方式伪造对象:

private static var m_physics = A.Fake<IPhysics>();

也就是说,使用“var”关键字。

但是,在这种情况下,C# 编译器不喜欢在非本地上下文中使用var的事实。我收到此错误:

上下文关键字“var”只能出现在局部变量声明中

我不能模拟一个不是本地的对象吗?

4

2 回答 2

6

我认为你错过了模拟/存根的意义。当您不希望被测对象根据它所依赖的其他组件通过或失败时,模拟和存根用于测试。因此,您要做的是将这些显式实现换成这些依赖项的模拟/存根,您可以在测试中完全控制这些依赖项。

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);
于 2011-05-11T17:24:46.840 回答
0

您只能在本地上下文(如功能块)中使用“var”关键字。您不能将类成员声明为“var”。

于 2011-05-11T17:17:29.200 回答