如何从Moq获得的模拟界面获得价值?
问题描述:
我正在尝试使用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”方法。
如何在不更改界面的情况下为我的模拟设置获取?
答
使用自己的实现
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);
所有嘲弄框架的设计,使我们的生活更轻松,因为我们并不需要编写自己的“假”的实施。
当你面临着嘲讽框架问题 - 写自己的模仿对象
相反Assert.AreEqual'的',也许你可以用'myTestMock.VerifySet(X => x.number = 3);' –
@ThariqNugrohotomo它会给我同样的错误“缺少获取访问者” – Th0rndike
@ Th0rndike - 删除'Assert'行。 @Thariq是正确的'myTestMock.VerifySet(x => x.number = 3);'工作。 (刚刚测试过,因为它对我来说也是新的)。 - 假设'c.Initialize();'*真*设置数字。我甚至尝试过'myTestMock.VerifySet(x => x.number = 4);'并且测试失败,因为它只认识到它被设置为3,而不是4. – Corak