0

我有许多 C# 集成测试使用由 cucumber 推广的 Given/When/Then 样式编写。我正在使用一个与 NBehave 基本相同的框架。

我面临的一个反复出现的问题是设置和连接集成测试所需的所有应用程序状态的问题。我的大多数测试看起来像这样:

给定一个空系统
  和一个新的 NetworkServer
  和一个新的 ServerDatabase
  还有一个新的事件记录器
  和一个新的网络连接
  还有一个新的 LoggingClient
当客户端记录新事件时
然后它应该出现在服务器数据库中

如您所见,动作和断言是单行的,但我有 6 行“接线”。几乎我的每个测试都重复这 6 行。

这对我来说似乎是一种代码味道,但我不确定如何处理这个问题。我可以将 6 行重构为一行(Given "a valid system..."或类似的),但这似乎太过分了,我会隐藏太多信息。

我会很感激其他在这方面有更多经验的人提出的任何想法。非常感谢。

4

2 回答 2

1

我们有这样的东西

public abstract class ContextSpecification
{
    [FixtureSetUp]
    public void SetUp()
    {
        EstablishContext();
        Act();
    }

    protected abstract void Act();

    protected abstract void EstablishContext();

    [FixtureTearDown]
    public void TidyUpCore()
    {
        TidyUp();
    }

    protected virtual void TidyUp()
    {

    }
}

然后对于每组类似的测试,我们创建一个 BaseContext 如下:

internal class TestClassTests 
{
    internal abstract class BaseContext : ContextSpecification
    {
        protected TestClass _sut;

        protected override void Act()
        {

        }

        protected override void EstablishContext()
        {
            _sut = new TestClass ();
           // common wiring
        }
    }

   internal class Given_this_situation : BaseContext
   {
       protected override void EstablishContext()
       {
           base.EstablishContext();
           // test specific wiring
       }

       protected override void Act()
       {
           // carry out the test actions
       }

       [UnitTest]
       public void ThisShouldBeTrue()
       {
          Assert.IsTrue();
       }
   }
}
于 2009-06-08T10:00:47.507 回答
1

对我来说,这闻起来就像你想要一个基类来做一些设置类的事情,然后让你的测试类从这个基类继承,只添加新的测试功能。

Base():
  constructor():
    do your wiring
    test if everything's ok


TestClass : Base
  constructor():
    Base.constructor()
    additional setup?

  test_functions()
    ..
于 2009-06-08T06:09:33.947 回答