如何在C#中模拟类成员?

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'可能只出现在局部变量声明中

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

jas*_*son 6

我想你错过了模拟/存根的重点.当您不希望受测试的主体通过或失败时,模拟和存根用于测试,具体取决于它所依赖的其他组件.所以你要做的就是将这些外部的显式实现交换为这些依赖项的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.我们不希望测试通过或失败是与否,我们给的具体实施FooIBar工作或没有.

[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)