2011-02-11 50 views
0

我读过很多关于嘲弄/磕碰/伪造 - 并仍然打击我的心理障碍。MVP与Moq - 加载嘲讽视图

我正在尝试将MVP(Model View Presenter)与一个“乐趣”减肥追踪系统相适应,我正在为自己的Fatty McFatter自创。我试图通过这本书'TDD &',但打了很多心智块,并失去了作用。

我在建立我的演示者并嘲笑我的服务&查看此刻。下面是我的测试:再次指出:服务和查看被嘲笑与起订量

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

    } 

,并在我的演示 - 这是我的显示方法:

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

现在 - 如果我调试的显示器被称为 - 我看到weightLog充满了我在模拟中设置的正确信息。但是,因为它假设设置View.EntryDate,View.Waist等 - 视图值永远不会改变。他们保持零或0001/1/1

有没有办法让它工作?或者这只是一个糟糕的测试,我在混乱中挣扎?

回答

2

感谢菲尔开始我的运动。虽然我不想明确地设定我将要返回的内容 - 我希望模拟视图像我的视图一样行事。通过调用SetupProperty - > view.SetupProperty(x => x.Weight)//在我的情况下,您可以让模拟的setter像平常一样运行......这里是现在将通过断言权重的测试设置为

[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

这里没有显示所有的设置代码,也没有显示类之间的依赖关系。

但是,如果你真的在嘲笑称为“myView”的视图,它将返回你有模拟设置返回的内容,或者如果你没有指定任何返回的内容,像发生的事情)。

从您的评论:

我想设置的 service.GetLog(日)返回 WeightLogModel我已经在测试中。我 的想法是,这样做 - 将使 在我 主持人WeightLogModel可用

到目前为止,这似乎是它是从你原来的问题的工作。

分配给我的嘲笑观点 - 在 View.EntryDate = weightLog.EntryDate ....在这种情况下weightLog是什么,是 设置在测试....我希望我清楚 至于我的头在哪里...我不是 说我是对的 - 这是我的 思想。

你要去哪里错了是你说的“分配给我的嘲笑视图”。从代码中不清楚View属性是否实际上是您的模拟视图(因为您的代码不完整)。

虽然,在这种情况下,它实际上并不重要。如果View属性实际上是一个模拟对象,它只会返回您告诉它返回的属性 - 它的属性不会像“普通”属性那样运行。

因此下面将失败没有明确设置:

mockView.MyProperty = "hello"; 
Assert.AreEqual("hello", mock.MyProperty); 
+0

感谢您的答复 - 不是真的发生了很多在设置 - 创造嘲笑是所有与嘲笑的服务与嘲笑查看演示。 至于其他设置 - 我想设置的service.GetLog(日)返回WeightLogModel我已经在测试中。 我的想法是这样 - 会提出这样的WeightLogModel提供我的演讲 - 分配给我的嘲笑观点 - 在View.EntryDate = weightLog.EntryDate ....在这种情况下weightLog是什么,是在测试设置.. .. 我希望我清楚到我的头......我不是说我是正确的 - 这是我的想法是什么,但。 – ajwaka

+0

查看我上面的编辑。 –