Given-When-Then处理用户输入时

时间:2013-10-04 16:01:25

标签: c# user-input bdd mvp arrange-act-assert

我正在寻找关于Arrange / Act / Assert的一些澄清,我在我的开发过程中实现了Given-When-Then。我试图坚持这个概念,但我发现在某些事件(特别是用户输入)中,我必须重新考虑“行动”动作作为“安排”动作,以便在单元测试中正确捕获它。我在这里使用 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();
}

但是这失败了,因为Message Box的Setup发生在调用View Raise之后。因此,我需要在它之前移动Setup(并使用Setup使其感觉像是“安排”设置一样):

给定已有图片的工作区
用户选择替换活动图像
用户请求新图片时 然后程序应该替换图像

但是现在,我的情况感觉不正常,并且它没有正确流动。我认为用户可以选择替换图像(Setup),因为在用户选择添加新图像(Raise)之后发生应该是法案步骤,但为了正确模拟,我需要把它放在编配步骤。

我在这里使用的模拟框架错了吗?有一个更好的方法吗?或者我是否不切实际地担心用户输入步骤应该在Given-When-Then设置中的位置?

提前致谢。

1 个答案:

答案 0 :(得分:1)

“当用户请求新图片时”用户 选择替换当前图片。

所以你可以重写“Given,When,Then”来阅读:

  • 给定已有图片的工作区
  • 时,用户选择替换活动图片
  • 然后该程序应该替换图像

即。省略“当”表示“用户请求新图像”,因为在替换当前图像时无论如何都必须这样做。

此外,我放弃了评论(代码味道,虽然授予它们的数量不多!)并将这些测试步骤放入小方法中,如下所示:

void GivenImageAlreadyPresent()
{
 mockModel.SetupProperty(m => m.Image, new Bitmap(100, 100));  
}

void WhenActiveImageReplaced()
{
 mockMBox.Setup(mb => mb.ViewResult).Returns(ViewResult.OK);   
 mockView.Raise(v => v.UserRequestsNewImage += null);          
}

void ThenImageShouldBeReplaced()
{
 mockView.Verify(v => v.OpenAddImageFileDialog(), Times.Once);
}

void Test()
{
 GivenImageAlreadyPresent();
 WhenActiveImageReplaced();
 ThenImageShouldBeReplaced();
}

这使得实际测试读取更好(即它现在自我记录),并且如果需要,它将能够重复使用这些步骤。