【发布时间】:2012-07-27 15:35:39
【问题描述】:
我有以下代码:
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 参数的派生类是否将正确的值传递给基类?
(如果您的答案是“使用合成...”,请使用上面修改的代码示例进行备份。
谢谢!
【问题讨论】:
-
“ATable”是否在您的实际情况下硬编码?是常量吗?
-
能否请您发布基类
Foo的单元测试?我看到它是一个abstract类(无法创建对象),而_target是一个私有变量(在测试中无法访问),很想知道您是如何对其进行单元测试的。 -
进一步@channs 评论 - Foo 的方法正在调用控制台,那么您如何测试这些方法?
标签: c# unit-testing abstract-base-class