我正在寻找有关 Arrange/Act/Assert 的一些说明,我在开发过程中将其作为 Given-When-Then 实施。我试图坚持这个概念,但我发现在某些事件(特别是用户输入)期间,我必须重新考虑将“Act”动作作为“Arrange”动作,以便在单元测试中正确捕获它. 我在这里使用Moq作为我的模拟框架。
例如:在我的项目中,代码的焦点是用户提供的图像。存在用户可以选择图像的功能,但如果图像已经存在,它将询问用户是否要替换活动图像,或者取消操作并保留活动图像。我觉得编写这个特定场景的正确方法是:
给定一个已经存在图像的工作区
当用户请求新图像
并且用户选择替换活动图像
然后程序应该替换图像
Testwise,它看起来像这样:
mockModel.SetupProperty(m => m.Image, new Bitmap(100, 100)); // Given
mockView.Raise(v => v.UserRequestsNewImage += null); // When
mockMBox.Setup(mb => mb.ViewResult).Returns(ViewResult.OK); // And
mockView.Verify(v => v.OpenAddImageFileDialog(), Times.Once); // Then
Codewise,在我的演示者中,它看起来像这样:
private void view_UserRequestsNewImage()
{
if (model.Image != null)
{
mbox.ShowDialog();
if (mbox.ViewResult == ViewResult.Cancel)
return;
}
view.OpenAddImageFileDialog();
}
但这失败了,因为消息框是在调用Setup
视图之后发生的Raise
。因此,我需要Setup
在它之前移动它(并且使用Setup
让它感觉就像一个“排列”设置):
给定一个已经存在图像的工作区
并且用户选择替换活动图像
当用户请求新图像时
,程序应该替换图像
但现在,我的场景感觉不正常,而且流程不正确。我觉得用户选择替换图像(the Setup
),因为它发生在用户选择添加新图像(the Raise
)之后,应该是 Act 步骤的一部分,但为了让它正确模拟,我需要把它放在排列步骤中。
我在这里使用了错误的模拟框架吗?有一个更好的方法吗?还是我不切实际地担心用户输入步骤在 Given-When-Then 设置中的位置?
提前致谢。