2017-09-01 87 views
3

我正在尝试使用Moq为特定接口编写一些测试。实现接口的对象的值由我们在这个问题中称为“controller”的类来设置。如何从Moq获得的模拟界面获得价值?

接口:

public interface ITestInterface 
{ 
    int number {set;} 
} 

我的模拟:

Mock<ITestInterface> myTestMock = new Mock<ITestInterface>(); 

做测试,我希望控制器设置在嘲笑类的数量,但后来我需要得到值来测试它。事情是这样的:

Controller c = new Controller(myTestMock.Object); 
c.Initialize(); //initialization will set number to something 
Assert.AreEqual(myTestMock.number, 3); 

当然,我得到一个错误,因为我无法读取该值,因为该接口没有一个“get”方法。

如何在不更改界面的情况下为我的模拟设置获取?

+1

相反Assert.AreEqual'的',也许你可以用'myTestMock.VerifySet(X => x.number = 3);' –

+0

@ThariqNugrohotomo它会给我同样的错误“缺少获取访问者” – Th0rndike

+2

@ Th0rndike - 删除'Assert'行。 @Thariq是正确的'myTestMock.VerifySet(x => x.number = 3);'工作。 (刚刚测试过,因为它对我来说也是新的)。 - 假设'c.Initialize();'*真*设置数字。我甚至尝试过'myTestMock.VerifySet(x => x.number = 4);'并且测试失败,因为它只认识到它被设置为3,而不是4. – Corak

回答

0

使用自己的实现

public class FakeTestInterface : ITestInterface 
{ 
    public int NumberValue { get; private set; } 
    public int number 
    { 
     set 
     { 
      NumberValue = value; 
     } 
    } 
} 

然后在测试

var testMock = new FakeTestInterface(); 
var controller = new Controller(testMock); 
controller.Initialize(); 
Assert.AreEqual(testMock.NumberValue, 3); 

所有嘲弄框架的设计,使我们的生活更轻松,因为我们并不需要编写自己的“假”的实施。
当你面临着嘲讽框架问题 - 写自己的模仿对象