单元测试将参数传递给基构造函数
本文关键字:构造函数 参数传递 单元测试 | 更新日期: 2024-07-27 13:03:55
我有以下代码:
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>
进行了单元测试。由于基类已经涵盖,我不想为派生类Bar
和Baz
编写相同的测试。
在派生类中,我唯一真正关心的是将正确的字符串target
传递给基类。
我正在努力研究如何在不破坏派生类的封装或编写冗余单元测试的情况下对其进行单元测试。
因此,问题是,如何测试target
参数的派生类是否将正确的值传递给基类?
(如果你的答案是"使用合成…",请用上面修改的代码样本进行备份。
谢谢!
我认为我更有可能通过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的后代了。
Foo和Bar单元测试方法可以调用包含公共测试代码的辅助方法。
您可以通过多种方式实现这一点。一种方法是,可以使用TypeMock这样的模拟框架来有效地模拟基类,从而从TypeMock中获得更多关于内部变量的信息。
不过,从你的帖子中还不清楚,为什么bar类在特定的原因中使用基类很重要。这一点还不清楚,因为你没有办法测试它。也就是说,你没有可以监控的外部行为来保证Bar
以预期的方式使用Foo
。可以重定向控制台输出,然后监视该输出以进行验证。但是,我不认为这是你真正想要的。
您应该提供一个更易于测试的示例;不只是输出文本的东西,有真实行为的东西,你可以通过测试观察到。