Typemock Isolator:模拟一个未注入的依赖项?

时间:2012-04-02 14:29:22

标签: constructor mocking dependencies typemock typemock-isolator

我的WidgetDoer课程取决于Foo,但未注入。我需要伪造_foo DoStuffWith()的实现(然后验证Do()返回结果 - 这是我实际代码的简化表示。)

public class WidgetDoer {
    readonly Foo _foo;

    public WidgetDoer() {
        _foo = new Foo();
    }

    public Bar Do(Widget widget) {
        var result = _foo.DoStuffWith(widget);
        return result;
    }
}

我尝试使用以下Isolator语法来阻止创建真正的Foo对象(在WidgetDoer()构造函数内),但实际上Foo对象被实例化了:

var fooFake = Isolate.Fake.Instance<Foo>();
Isolate.WhenCalled(() => new Foo()).WillReturn(fooFake);

我可以使用Typemock来模拟未注入的依赖项吗?

3 个答案:

答案 0 :(得分:4)

这段代码允许我模拟耦合依赖:

Isolate.Swap.NextInstance<Foo>().With(FooFake);

请记住,TypeMock supports very few types from mscorlib

答案 1 :(得分:2)

声明我在Typemock工作。

交换实例现在已经过时了。 您可以使用:

var fakeFoo = Isolate.Fake.NextInstance<Foo>();

fakeFoo是代码中_foo的代理。

您也可以使用:

var fakeFoo = Isolate.Fake.AllInstances<Foo>();

这里,fakeFoo是从这一行创建(新)的所有Foo实例的代理。

这两个示例都在一个命令中创建了和“交换”。

答案 2 :(得分:0)

首先,在使用TypeMock Isolatar API时,我强烈建议您将此PDF文件放在身边:TypeMock Isolator API Quick Reference(PDF)

关于上述观点,是的,我发现创造假货并不意味着它被使用是一个常见的错误。正如您在上面指出的那样,为了使用它,您必须执行以下操作:

Isolate.Swap.NextInstance<Foo>().With(FooFake);

这将交换下一个实例。我很确定你也可以这样做:

Isolate.Swap.NextInstance<Foo>().With(FooFake);
Isolate.Swap.NextInstance<Foo>().With(FooFake2);

这会将下一个对象创建与FooFake实例交换,然后用FooFake2交换后面的对象

你也可以这样做:

Isolate.Swap.AllInstances<Foo>().With(FooFake);

这会将所有未来的对象创建与假交换。如果您正在查看可能不太明显对象创建次数的代码,这非常有用。