【发布时间】:2015-03-03 20:04:01
【问题描述】:
这是我的例子:
void doneWithCurrentState(State state) {
switch (state) {
case State.Normal:
// this method is never actually called with State.Normal
break;
case State.Editing:
controller.updateViewState(State.Normal);
database.updateObjectWithDetails(controller.getObjectDetailsFromViews())
break;
case State.Focus:
controller.updateViewState(State.Editing);
break;
}
}
当按下特定按钮时,我的controller 会调用doneWithCurrentState。 states 是屏幕上的不同位置,controller 的视图可以假定。
如果当前状态为Normal,按钮将被隐藏。
如果在当前状态为Editing 的情况下按下按钮,则将调用doneWithCurrentState 方法(我说方法是因为它实际上是在一个类中),它应该将控制器的视图状态更改为@987654330 @ 并使用应从控制器视图(即文本字段,复选框等)。
如果在当前状态为Focus 的情况下按下按钮,它应该只是发送回Editing 状态。
我正在像这样对它进行单元测试:
void testDoneWithCurrentStateEditing() {
mockController.objectDetails = ...;
myClass.doneWithCurrentState(State.Editing);
AssertEqual(mockController.viewState, State.Normal, "controller state should change to Normal");
AssertTrue(mockDatabase.updateObjectWithDetailsWasCalled, "updateObjectWithDetails should be called");
AssertEqual(mockDatabase.updatedWithObjectDetail, mockController.objectDetails, "database should be updated with corresponding objectDetails");
}
void testDoneWithCurrentStateFocus() {
myClass.doneWithCurrentState(State.Focus);
AssertEqual(mockController.viewState, State.Editing, "controller state should change to Editing");
AssertFalse(mockDatabase.updateObjectWithDetailsWasCalled, "updateObjectWithDetails should not be called");
}
但这似乎是错误的,似乎我在断言一个方法调用已经完成,然后我正在调用......这就像断言 setter 和 getter 方法一样。
测试doneWithCurrentState 方法的正确方法是什么?
作为答案的一部分,我确实接受类似“首先你应该重构方法以更好地分离这些问题......”。
谢谢。
【问题讨论】:
-
就是
wasCalled后面的断言 -
对了,有人需要眼镜
-
我多次阅读您的代码,但在您的测试中看不到任何错误。那很好White boxing tests
标签: unit-testing testing mocking tdd