如何在 C# 中模拟类成员

本文关键字:模拟类 成员 | 更新日期: 2023-09-27 17:56:14

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

FakeItEasy 文档指出您以类似于这样的方式伪造对象:

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

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

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

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

我不能模拟非本地对象吗?

如何在 C# 中模拟类成员

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

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"。