我最近发现了Presenter First并阅读了他们的白皮书和博客等.
在我发现的大多数示例中,事件不是直接在接口上声明,而是作为它的方法.例如,
public interface IPuzzleView
{
void SubscribeMoveRequest(PointDelegate listener);
// vs
event PointDelegate MoveRequest;
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.我以为我在某个地方看到了一篇文章/文章/博客,解释了这背后的原因,但我再也找不到了.所述文本还包含单元测试代码的片段 - 我知道这是因为我记得对自己说,其中一个单元测试是不正确的.
更新:
以下是比较示例:
public class Collect
{
public static CollectAction<T> Argument<T>(int index,
CollectAction<T>.Collect collectDelegate)
{
CollectAction<T> collect = new CollectAction<T>(index, collectDelegate);
return collect;
}
}
public interface IApplicationView
{
event EventHandler Load;
// or
void SubscribeLoad(Action action);
}
Mockery mockery = new Mockery();
IApplicationView view = mockery.NewMock<IApplicationView>();
IApplicationModel model = mockery.NewMock<IApplicationModel>();
Run Code Online (Sandbox Code Playgroud)
订阅风格:
Action savedAction = null;
Expect.Once.On(view).Method("SubscribeLoad").Will(
Collect.Argument<Action>(0,
delegate(Action action) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将Presenter-First方法用于新项目.我发现自己下面是unittest.我是否通过在此测试中包含如此多的断言来利用不良的单元测试实践?如果是,我的测试方法或presenter.setOverview的实现问题是什么?换句话说,setOverview方法应该调用self.setSalesQty而不是self.view.setSalesQty吗?在这种情况下,我将对presenter.setSalesQty进行单独测试,testSetOverview测试将不再需要担心测试它.
def testSetOverview(self):
# set up mock objects
p = PropertyMock()
type(self.mock_model).descriptions = p
self.mock_model.getData.side_effect = [5, 10]
self.mock_model.getDescription.side_effect = 'Description'
# get required variables
end = dt.date.today()
start = dt.date(year=end.year, month=1, day=1)
pn = 'abcd'
# call presenter method
self.presenter.setOverview(pn)
# test to make sure proper calls were made
model_getData_calls = [call(pn=pn, start=start, end=end,
data=self.mock_model.SHIPPED_QUANTITY),
call(pn=pn, start=start, end=end,
data=self.mock_model.PRICE_PAID)]
self.mock_model.getData.assert_has_calls(model_getData_calls, any_order=True)
assert self.mock_model.getDescription.called
self.mock_view.setSalesQty.assert_called_with(val=5)
self.mock_view.setSalesDols.assert_called_with(val=10)
self.mock_view.setDescription.assert_called_with(val='Description')
Run Code Online (Sandbox Code Playgroud)