如何简化这些NUNit测试?

如何简化这些NUNit测试?,nunit,testcase,Nunit,Testcase,这三个测试是相同的,只是它们使用不同的静态函数来创建StartInfo实例。我所有的测试代码都会用到这个模式,我很乐意 能够使用[TestCase]或任何其他减少样板代码的方法来简化此过程。就我所知,我不允许使用委托作为[TestCase]参数,我希望这里的人对如何使下面的代码更简洁有创造性的想法 [Test] public void ResponseHeadersWorkinPlatform1() { DoResponseHeadersWorkTest(

这三个测试是相同的,只是它们使用不同的静态函数来创建StartInfo实例。我所有的测试代码都会用到这个模式,我很乐意 能够使用[TestCase]或任何其他减少样板代码的方法来简化此过程。就我所知,我不允许使用委托作为[TestCase]参数,我希望这里的人对如何使下面的代码更简洁有创造性的想法

    [Test]
    public void ResponseHeadersWorkinPlatform1()
    {
        DoResponseHeadersWorkTest(Platform1StartInfo.CreateOneRunning);
    }
    [Test]
    public void ResponseHeadersWorkinPlatform2()
    {
        DoResponseHeadersWorkTest(Platform2StartInfo.CreateOneRunning);
    }
    [Test]
    public void ResponseHeadersWorkinPlatform3()
    {
        DoResponseHeadersWorkTest(Platform3StartInfo.CreateOneRunning);
    }

    void DoResponseHeadersWorkTest(Func<ScriptResource,StartInfo> startInfoCreator)
    {
        ScriptResource sr = ScriptResource.Default;
        var process = startInfoCreator(sr).Start();
        //assert some things here
    }
[测试]
公共无效响应HeadersWorkinPlatform1()
{
DoResponseHeadersWorkTest(平台1StartInfo.CreateOnRunning);
}
[测试]
公共无效响应HeadersWorkinPlatform2()
{
DoResponseHeadersWorkTest(Platform2StartInfo.CreateOnRunning);
}
[测试]
公共无效响应负责人WorkinPlatform3()
{
DoResponseHeadersWorkTest(平台3StartInfo.CreateOnRunning);
}
无效或响应负责人工作测试(Func startInfoCreator)
{
ScriptResource sr=ScriptResource.Default;
var进程=startInfoCreator(sr.Start();
//在这里断言一些事情
}

看起来不错。你想增加一个工厂吗?或者您可以将这些方法添加到操作列表(在测试设置中),并调用第一个操作委托、第二个操作委托和第三个操作委托

首先,我不认为原作太差。只有当您的断言在不同的测试用例中是不同的,这才是混乱的

无论如何,可以使用测试用例,但是由于使用了更复杂的类型,不能通过标准的[TestCase]属性来完成。相反,您需要使用公共IEnumerable作为数据提供程序,然后用属性标记测试方法

尝试以下方法:

    public IEnumerable<Func<ScriptResource, StartInfo>> TestCases
    {
        get
        {
            yield return Platform1StartInfo.CreateOneRunning;
            yield return Platform2StartInfo.CreateOneRunning;
            yield return Platform3StartInfo.CreateOneRunning;
        }
    }

    [TestCaseSource("TestCases")]
    public void MyDataDrivenTest(Func<ScriptResource, StartInfo> startInfoCreator)
    {
        ScriptResource sr = ScriptResource.Default;
        var process = startInfoCreator(sr);

        // do asserts
    }
}
public IEnumerable测试用例
{
得到
{
收益回报平台1StartInfo.CreateOnRunning;
收益返回平台2StartInfo.CreateOnRunning;
收益返回平台3StartInfo.CreateOnRunning;
}
}
[TestCaseSource(“TestCases”)]
公共无效MyDataDrivenTest(Func startInfoCreator)
{
ScriptResource sr=ScriptResource.Default;
var过程=STARTINFOCUREATOR(sr);
//做断言
}
}
这是生成包含参数的TestCaseData实例的标准模式的更简洁版本。如果您生成TestCaseData实例,您可以为每个测试添加更多的信息和行为(如预期的异常、描述等),但它会稍微详细一些


我喜欢这个东西的部分原因是,你可以为你的“act”和“assert”创建一个方法,然后独立地混合和匹配它们。例如,我的朋友昨天做了一件事,他使用了两个动作来表示(“当调用方法Blah时,应该触发ViewModel上的此方法”)。非常简洁有效

+1不错。这是一个改进的方法。