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

时间:2011-05-11 17:10:25

标签: c# mocking var fakeiteasy

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

FakeItEasy文档表明您以与此类似的方式伪造对象:

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

即使用“var”关键字。

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

上下文关键字'var'可能只出现在本地变量声明

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

2 个答案:

答案 0 :(得分:6)

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

class Foo {
    public Foo(IBar bar) { }
    public object M() { // do something with IBar }
}

此处Foo依赖于IBar。我们想测试Foo.M。根据我们提供给Foo的{​​{1}}的具体实现是否有效,我们不希望测试通过或失败。

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; }
}

答案 1 :(得分:0)

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