我正在寻找关于Arrange/Act/Assert的一些澄清,我在开发过程中将其作为Given-When-Then实现。我试图坚持这个概念,但我发现在某些事件(尤其是用户输入)期间,我必须重新考虑一个“Act”动作作为“Arrange”动作,以便在单元测试中正确捕获。我在这里使用Moq作为我的模拟框架。Given-When-Then当处理用户输入
例如:在我的项目中,代码的焦点是用户提供的图像。用户可以选择图像的功能存在,但是如果图像已经存在,它将询问用户是否要替换活动图像,或取消操作并保留活动图像。我觉得写此特定情形的适当的办法是:
鉴于与已经存在的图像的工作空间
当用户请求一个新的形象
而用户选择更换活动图像
然后程序应更换图像
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
:
鉴于与已经存在的图像的工作空间
而用户选择更换活动图像
当用户请求一个新的形象
然后程序应更换图像
但是现在,我的情景感觉不合适,而且流程不正确。我觉得用户选择替换图像(Setup
),因为它出现后用户选择添加一个新图像(Raise
),应该是Act步骤的一部分,但为了让它正确地模拟,我需要把它放在编配步骤中。
我在这里使用嘲笑框架错误吗?有一个更好的方法吗?或者我是不是很现实地烦恼用户输入步骤应该位于Given-When-Then设置中的位置?
在此先感谢。
有了一些自定义的扩展方法,您可以链接在一起的时候,而且是如此你写他们,因为他们流逻辑,但不是直接调用起订量,把拉姆达在一个堆栈和终止表达后,按相反的顺序执行。 –