C# StoryQ BDD,给定或无主体时

C# StoryQ BDD,给定或无主体时,c#,bdd,storyq,C#,Bdd,Storyq,我想对我的类的构造函数做一个非常简单的测试 [Test] public void InitLensShadingPluginTest() { _lensShadingStory.WithScenario("Init Lens Shading plug-in") .Given(InitLensShadingPlugin) .When(Nothing) .Then(PluginIsCreated) .Execute(); }

我想对我的类的构造函数做一个非常简单的测试

[Test]
public void InitLensShadingPluginTest()
{
    _lensShadingStory.WithScenario("Init Lens Shading plug-in")
        .Given(InitLensShadingPlugin)
        .When(Nothing)
        .Then(PluginIsCreated)
        .Execute();
}
这可以是给定的,也可以是。。。我想应该在什么时候,但这并不重要

private void InitLensShadingPlugin()
{
    _plugin = new LSCPlugin(_imagesDatabaseProvider, n_iExternalToolImageViewerControl);
}
因为构造函数是被测试的,所以在When语句中我没有任何事情要做

然后我断言插件的创建

private void PluginIsCreated()
{
    Assert.NotNull(_plugin);
}
我的问题是关于StoryQ的,因为我不想在里面做任何事情 我尝试使用When=>{}但是storyQ不支持这一点, 这意味着我需要实现类似

private void Nothing()
{
}
什么时候打电话


有更好的做法吗

奇怪的是,StoryQ不支持缺少的步骤;您的场景实际上是我使用过的启动应用程序、游戏等的其他示例的典型例子:

Given the chess program is running
Then the pieces should be in the starting positions
比如说。因此,你希望使用一个条件,然后是一个结果,这是完全正确的

看看StoryQ的API,它看起来并不支持这些空步骤。您始终可以创建自己的方法,并调用其中的给定步骤和When步骤,从When返回操作:

    .GivenIStartedWith(InitLensShadingPlugin)
    .Then(PluginIsCreated)
如果这看起来太笨拙,我会按照您的建议,将给定的移动到a When,用一个更具意义的名称的空方法初始化给定的:

    Given(NothingIsInitializedYet)
    .When(InitLensShadingPlugin)
    .Then(PluginIsCreated)
这两种方法都能解决你的问题

然而,如果您所测试的只是一个类,而不是整个应用程序,那么使用StoryQ可能有点过头了。自然语言BDD框架,如StoryQ、Cucumber、JBehave等,旨在帮助业务和开发团队在探索需求时进行协作。它们会产生大量的设置和维护开销,因此,如果类级场景/示例的受众是技术性的,那么可能有更简单的方法

对于类级别的行为示例,我将使用一个简单的单元测试工具,如NUnit或MSpec。我喜欢使用NUnit并将我的给定/何时/然后放在评论中:

// 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);
类级别的步骤在整个系统场景中的重用方式不同,因为类具有更小、更封装的职责;开发人员从阅读代码中获益,而不是将代码隐藏在步骤定义中

如果类直接驱动用户看到的功能,那么您在此处给出的/When/Then注释可能仍会在更高级别上反映场景

通常,对于完整的系统场景,我们将从与3位朋友的对话中得出以下步骤:

业务代表PO、SME、有问题需要解决的人 一个能够发现我们可能错过的场景的测试人员 解决问题的开发人员。 可能会有一对开发者。如果用户界面设计师愿意,他们可以参与进来。表示是3个朋友,其中3是3到7之间的任意数字。进行对话的最佳时间是在开发人员开始编写代码之前


然而,如果你自己工作,不管是玩具还是真实的应用程序,你可能只会从想象中的对话中受益

为什么需要将此测试作为BDD场景编写?因为它不是。BDD的一个更好的实践是,从与业务部门的讨论中得出有意义的场景。@rad我正在试验我能用StoryQ做什么或不能用什么,我正在使用Nunit,但是在我看来,你必须使用两个测试框架而不是一个,这总是很奇怪。在这种情况下,没有必要使用这两个框架,实际上,我怀疑这个场景是否适合测试。您应该测试行为,通常在构造函数中放入逻辑/行为不是一个好主意。编写BDD场景对于与业务通信和构建与业务共享的无处不在的领域语言非常有用。如果你不在这种情况下,那么就使用NUnit lol。如果场景没有事先需要的状态,那么我只需要when和then步骤就完全可以了。如果你没有一个when步骤,那可能是一种没有行为可测试的气味。@lunivore我想有很多方法可以阅读和执行BDD,我非常喜欢自从Dan North写了他的第一篇关于它的文章以来的演变,通过示例让它更多地与业务规范通信。。。。我确实同意你的场景是有价值的,但它可以很容易地写成当你开始游戏时,网格应该是空的。。。我想我也可以主张最初的TDD是关于意图的。。。感谢分享:首先通过示例进行探索。然后通过实例说明。然后通过示例作为一个不错的副产品进行测试。拥有对话比捕获对话更重要,比自动化对话更重要。不客气!嗨,谢谢你的回答。我当然在用Nunit。我正在使用BDD模式来测试系统测试,但是我想知道更简单的用例。谢谢