2011-08-19 37 views
0

大家嘲讽类,TypeMock:用假值

我有一个类“ABC”,我在其中有一定只读属性(Context)。在“Abc”类的构造函数中,我设置了使用私有变量只读属性的值(_context)。例如Abc() {_context=new Xyz();}

我想创建一个使用TypeMock的测试用例,其中我想模拟Xyz类并返回值为_context。这样我可以使用一些假数据填充上下文。

请让我知道是否有可能嘲笑类的价值观。谢谢

回答

3

你想要看的是隔离器的“交换”功能。

// First set up your fake Xyz. 
var fakeXyz = Isolate.Fake.Instance<Xyz>(); 
Isolate.WhenCalled(() => fakeXyz.SomeMethod()).WillReturn("Value"); 

// Now tell Isolator that the next time someone does 
// "new Xyz()" you want it to be your fake. 
Isolate.Swap.NextInstance<Xyz>().With(fakeXyz); 

// Create your Abc and do your assertions. This should pass: 
var realAbc = new Abc(); 
Assert.AreEqual("Value", realAbc.Context.SomeMethod(); 

搞清楚这种基本隔离功能的一个很好的参考是the online documentation on the Typemock site。检查“快速启动”和“使用Typemock隔离器”部分。还有更多的例子可以向你展示如何做类似和更高级的事情。

更新:我以前显示Assert.AreSame(fakeXyz, realAbc.Context)作为验证交换发生的方式。看起来,在某些版本的Typemock中,Assert.AreSame将会失败,因为在工作中有某种动态代理机制 - 它们实际上并不是实际交换,实际上是虚假的相同实例,他们做了一些欺骗手段事情发生。但是,假实例上的调用仍将被调用,并且您仍将获得预期的结果。我已经更新了相应的示例代码片段。

+0

是否有更简单的语法?例如,在MOQ中,您将定义一个简单的一行代码... fakeXyz.SetupGet(x => x.Context).Returns(()=> m_context); – stoj

+1

这就是设置中的第二行 - “Isolate.WhenCalled”与您正在讨论的“SetupGet”等价。 'Isolate.Fake.Instance'相当于Moq中的'var mock = new Mock ()'。在Moq中'Isolate.Swap.NextInstance'没有等价物,因为Moq不使用profiler API,所以不能用隔离器的方式将调用换成'new'。 –