4

我的WidgetDoer类取决于Foo,它没有被注入。我需要假冒_foo的执行DoStuffWith()(然后验证Do()返回结果 - 这是我的真实代码的简化表示)。Typemock Isolator:模拟未注入的依赖关系?

public class WidgetDoer { 
    readonly Foo _foo; 

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

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

我试着用下面的隔离语法来防止创建(在WidgetDoer()构造函数中)真正的Foo对象,但真正Foo对象反正实例:

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

我可以使用Typemock模拟未注入的依赖关系?

回答

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

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

2

免责声明我在Typemock工作。

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

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

fakeFoo是代理在代码_Foo。

您还可以使用:

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

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

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