代码之家  ›  专栏  ›  技术社区  ›  Lucas Meijer

我如何简化这些修女测试?

  •  6
  • Lucas Meijer  · 技术社区  · 15 年前

    这三个测试是相同的,只是它们使用不同的静态函数来创建startinfo实例。我的测试代码中都有这个模式,我会喜欢的 为了能够使用[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
        }
    
    2 回复  |  直到 15 年前
        1
  •  8
  •   Mark Simpson    15 年前

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

    不管怎样,你 可以 使用一个测试用例,但是由于使用了更复杂的类型,不能通过标准的[test case]属性来完成。相反,您需要使用公共IEnumerable作为数据提供程序,然后用 [TestCaseSource] 属性。

    尝试以下方法:

        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
        }
    }
    

    这是生成包含参数的testcasedata实例的标准模式的更简洁的版本。如果您生成testcasedata的实例,那么您可以向每个测试添加更多的信息和行为(如预期的异常、描述等),但它稍微更详细一些。

    我真正喜欢这些东西的部分原因是你可以为你的“行为”做一个方法,为你的“断言”做一个方法,然后独立地混合和匹配它们。例如,我的朋友昨天做了一件事,他用两个动作说(“当调用方法blah时,应该触发ViewModel上的这个方法”)。非常简洁有效!

        2
  •  0
  •   Prashant    15 年前

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

    推荐文章