单元测试将参数传递给基础构造函数

时间:2012-07-27 15:35:39

标签: c# unit-testing abstract-base-class

我有以下代码:

        using System;
        using NUnit.Framework;
        using Rhino.Mocks;

        public class A
        {
        }

        public class B
        {
        }

        public interface IStatementExecutor
        {
            void Exec(string statement);
        }

        public abstract class Foo<T>
        {
            private readonly IStatementExecutor _statementExecutor;
            private readonly string _targetSegment;

            protected Foo(IStatementExecutor statementExecutor, string targetSegment)
            {
                _statementExecutor = statementExecutor;
                _targetSegment = targetSegment;
            }

            public void Update(T item)
            {
                _statementExecutor.Exec("sp_" + _targetSegment + "Update");
            }
        }

        public class Bar : Foo<A>
        {
            public Bar(IStatementExecutor statementExecutor)
                : base(statementExecutor, "ATable")
            {
            }
        }

        public class Baz : Foo<B>
        {
            public Baz(IStatementExecutor statementExecutor)
                : base(statementExecutor, "BTable")
            {
            }
        }

        [TestFixture]
        public class Foo_Tests
        {
            [Test]
            public void Update_CallsStatementExecutorWithTableName()
            {
                const string tableName = "TestTable";
                var mockStatementExecutor = MockRepository.GenerateMock<IStatementExecutor>();
                mockStatementExecutor.Expect(m => m.Exec("sp_" + tableName + "Update"));
                var sut = MockRepository.GeneratePartialMock<Foo<A>>(mockStatementExecutor, tableName);
                var testModel = new A();


                sut.Update(testModel);

                mockStatementExecutor.AssertWasCalled(m => m.Exec("sp_" + tableName + "Update"));
            }
        }

我已经对基类Foo<T>进行了单元测试。由于已经涵盖了基类,我不想为派生类BarBaz编写相同的测试。

我在派生类中唯一关心的是将正确的字符串target传递给基类。

我正在努力研究如何在不破坏派生类的封装或编写冗余单元测试的情况下进行单元测试。

所以,问题是,如何测试正确的值是否从target参数的派生类传递给基类?

(如果您的回答是“使用合成......”,请使用从上面修改的代码示例进行备份。

谢谢!

3 个答案:

答案 0 :(得分:1)

认为我更有可能通过Bar和Baz上的其他方法进行测试,因为如果你把ZTable放在那里而不是BTable那么你会发生不好的事情

您可以向Foo添加一个方法,该方法将返回传递给它的内容

然后在创建后代之后调用它并验证预期值。

或者你可以做类似

的事情
public class Bar : Foo<A>     
{         
  private static String _tableName = "ATable";
  public String  TableName {get {return _tableName;}}
  public Bar() : base(_tableName)         
  {         
  }     
} 

然后你可以测试testBar.TableName

另一个选项是T是一个结构或具有TableName属性的类,那么你就不需要Bar和Baz后代了。

答案 1 :(得分:0)

您的Foo和Bar单元测试方法可以调用包含通用测试代码的辅助方法。

答案 2 :(得分:0)

你可以通过多种方式做到这一点。有一种方法可以使用像TypeMock这样的模拟框架来有效地模拟基类,从而从TypeMock获取有关内部变量的更多信息。

但是,从你的帖子中可以清楚地看出,为什么重要的是基类用于bar类的具体原因。这一点尚不清楚,因为您无法对其进行测试。即,您无法监控外部行为,以确保Bar以预期的方式使用Foo。您可以重定向控制台输出,然后监视该输出以进行验证。但是,我认为这不是你想要的。

你应该提供一个更可测试的例子;不仅仅是输出文本的东西,具有你可以通过测试观察到的真实行为的东西。