我已经阅读了很多关于嘲弄/抄袭/伪装的内容 - 但仍然遇到了我的心理障碍。
我正在努力使MVP(模型视图演示者)适应我为自己的Fatty McFatter-self建立的“有趣”减肥跟踪系统。我正在尝试TDD& “通过这本书”,但是打了很多精神障碍并且失速了。
我正在构建我的演示者并嘲笑我的服务&查看此刻。这是我的测试:再次注意:服务和视图都是用Moq模拟的
[Test]
public void GetLog_WithExistingDate_ViewSetWithExistingLog()
{
WeightLogModel model = new WeightLogModel
{
EntryDate = DateTime.Now,
Waist = 42,
Weight = 242
};
service.Setup(x => x.GetLog(It.IsAny<DateTime>())).Returns(model);
presenter.Display(DateTime.Now);
IWeightLogView myView = view.Object;
Assert.AreEqual(model.Weight, myView.Weight);
}
在我的Presenter中 - 这是我的显示方法:
public void Display(DateTime date)
{
var weightLog = service.GetLog(date);
if(weightLog == null) return;
View.EntryDate = weightLog.EntryDate;
View.Waist = weightLog.Waist;
View.Weight = weightLog.Weight;
}
现在 - 如果我调用Display正在调用 - 我看到weightLog填充了我在mock中设置的正确信息。但是,因为它假设设置View.EntryDate,View.Waist等 - 视图值永远不会改变。它们保持为零或0001/1/1
有没有办法让它发挥作用?或者这只是一个糟糕的测试,我在困惑中挣扎?
答案 0 :(得分:2)
感谢Phil让我开始行动。虽然我不想明确设置我要返回的内容 - 但我希望模拟视图的行为与我的观点相似。您可以通过调用SetupProperty来使模拟的setter正常运行 - &gt; view.SetupProperty(x =&gt; x.Weight)//在我的情况下......这是现在通过的测试断言权重已设置
[Test]
public void GetLog_WithExistingDate_ViewSetWithExistingLog()
{
WeightLogModel model = new WeightLogModel
{
EntryDate = DateTime.Now,
Waist = 42,
Weight = 242
};
service.Setup(x => x.GetLog(It.IsAny<DateTime>())).Returns(model);
// I ADDED THIS ONE LINE
view.SetupProperty(x => x.Weight);
presenter.Display(DateTime.Now);
IWeightLogView myView = view.Object;
Assert.AreEqual(model.Weight, myView.Weight);
}
答案 1 :(得分:1)
您没有在此处显示所有设置代码,也没有显示类之间的依赖关系。
但是,如果您确实在嘲笑名为“myView”的视图,它将返回您为模型设置返回的内容,或者如果您没有指定要返回的任何内容,则返回每种类型的默认值(听起来像发生了什么事。)
来自你的评论:
我正在尝试设置 service.GetLog(date)返回 WeightLogModel我在测试中。我的 思考是这样做 - 会做 那个WeightLogModel在我的 演示
到目前为止,它看起来似乎与原始问题有关。
分配给我的模拟视图 - 在哪里 View.EntryDate = weightLog.EntryDate ....在这种情况下,weightLog是什么 在测试中设置....我希望我很清楚 至于我的头在哪里......我不是 说我是对的 - 这就是我的意思 但是想的是。
你错在哪里就是你说“分配给我的模拟视图”。从您的代码中不清楚View属性是否实际上是您的模拟视图(因为您的代码不完整)。
虽然在这种情况下,实际上并不重要。如果View属性实际上是一个mock,它只返回你告诉它返回的内容 - 它的属性不会像“普通”属性那样。
因此,如果没有明确的设置,以下内容将失败:
mockView.MyProperty = "hello";
Assert.AreEqual("hello", mock.MyProperty);