我想对我班级的构造函数进行一个非常简单的测试,
[Test]
public void InitLensShadingPluginTest()
{
_lensShadingStory.WithScenario("Init Lens Shading plug-in")
.Given(InitLensShadingPlugin)
.When(Nothing)
.Then(PluginIsCreated)
.Execute();
}
这可以在Given或者它...我认为它应该在When()中但它并不重要。
private void InitLensShadingPlugin()
{
_plugin = new LSCPlugin(_imagesDatabaseProvider, n_iExternalToolImageViewerControl);
}
由于构造函数是被测试者,我在When()
语句中没有任何事情可做,
在Then()
中,我断言插件的创建。
private void PluginIsCreated()
{
Assert.NotNull(_plugin);
}
我的问题是关于StoryQ,因为我不想在When()内做任何事情
我试图使用When(()=>{})
但是storyQ不支持
这意味着我需要实现像
private void Nothing()
{
}
并致电When(Nothing)
有更好的做法吗?
答案 0 :(得分:1)
奇怪的是,StoryQ不支持缺少步骤;您的场景实际上是我用于启动应用程序,游戏等的其他示例的典型代表:
Given the chess program is running
Then the pieces should be in the starting positions
例如。因此,您希望使用条件后跟结果是完全有效的。
看看StoryQ的API,它看起来好像不支持这些空步骤。您始终可以创建自己的方法并调用其中的Given和When步骤,从When:
返回操作 .GivenIStartedWith(InitLensShadingPlugin)
.Then(PluginIsCreated)
如果这看起来太笨重了,我会按照你的建议去做,并将Given移动到When,用一个更有意义的名字用空方法初始化Given:
Given(NothingIsInitializedYet)
.When(InitLensShadingPlugin)
.Then(PluginIsCreated)
其中任何一个都可以解决您的问题。
但是,如果你所测试的只是一个类,而不是整个应用程序,那么使用StoryQ可能有点过分。自然语言BDD框架(如StoryQ,Cucumber,JBehave等)旨在帮助业务和开发团队协作探索需求。它们会产生大量的设置和维护开销,因此如果您的类级别方案/示例的受众是技术性的,那么可能会有一种更简单的方法。
对于类级别的行为示例,我将使用像NUnit或MSpec这样的普通单元测试工具。我喜欢使用NUnit并在评论中添加“Given / When / Then”:
// Given I initialized the lens shading plugin on startup
_plugin = new LSCPlugin(_imagesDatabaseProvider, n_iExternalToolImageViewerControl);
// Then the plugin should have been created
Assert.NotNull(_plugin);
类级别的步骤不会以与完全系统方案相同的方式重用,因为类具有更小,更多的封装职责;并且开发人员可以从阅读代码中获益,而不是将其隐藏在步骤定义中。
您的Given / When / Then如果该类直接驱动用户看到的功能,那么这里的评论可能仍然会回应更高级别的场景。
通常对于完整系统场景,我们会从与“3 amigos”的对话中得出步骤:
可能有一对开发者。 UI设计师可以参与其中。 Matt Wynne说它是“3 amigos,其中3是3到7之间的任何数字”。在开发人员开始编写代码之前,进行对话的最佳时机是正确的。
然而,如果你自己工作,无论是玩具还是真正的应用程序,你都可以从虚构的对话中受益。 I use a pixie called Thistle for mine.