我有以下代碼:單位通過測試參數的基礎構造
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」是硬編碼嗎?它是一個常量? – 2012-07-27 15:44:03
你可否請你發佈你的基類'Foo'的單元測試?我發現它是一個'abstract'類(不能創建對象),'_target'是一個私有變量(在測試中不可訪問),好奇地想知道你是如何進行單元測試的。 – Channs 2012-07-27 15:47:00
進一步到@channs評論 - Foo的方法正在呼叫到控制檯,那麼你如何測試這些? – 2012-07-27 15:47:42