我的測試類在其構造函數中使用了2個對象,一個數據加載器和一個使用數據加載器返回的數據的類。驗證在函數調用中傳遞的方法是否正確
數據加載器接口有2個函數,LoadCompanies()和LoadEmployees(),它們都接受一個int參數並返回一個IEnumerable。
如何驗證被測方法是否將LoadCompanies()和非LoadEmployees()傳入數據使用者類?
這裏是我的代碼:
[TestFixture]
public class TestingFunctionalParameters_UT
{
[Test]
public void Correct_Loader_Method_is_Used()
{
const int userId = 1;
var companies = new[] { "c1", "c2" };
var dataLoader = MockRepository.GenerateMock<ITestDataLoader>();
var dataConsumer = MockRepository.GenerateMock<IDataConsumerClass>();
var testObject = new TestClass(dataLoader, dataConsumer);
dataConsumer.Expect(fc => fc.LoadIt(Arg<Func<IEnumerable<string>>>.Is.TypeOf)).Return(true);
//TODO: validate that correct dataloader function was called...
//dataLoader.Expect(dl => dl.LoadCompanies(userId)).Return(companies);
var result = testObject.Run(userId);
Assert.That(result, Is.True);
dataLoader.VerifyAllExpectations();
dataConsumer.VerifyAllExpectations();
}
}
public class TestClass
{
private readonly ITestDataLoader dataLoader;
private readonly IDataConsumerClass funcClass;
public TestClass(ITestDataLoader dataLoader, IDataConsumerClass funcClass)
{
this.dataLoader = dataLoader;
this.funcClass = funcClass;
}
public bool Run(int userId)
{
Func<IEnumerable<string>> loadFn =() => dataLoader.LoadCompanies(userId);
return funcClass.LoadIt(loadFn);
}
}
public interface ITestDataLoader
{
IEnumerable<string> LoadCompanies(int userId);
IEnumerable<string> LoadEmployees(int userId);
}
public interface IDataConsumerClass
{
bool LoadIt(Func<IEnumerable<string>> load);
}
爲什麼你要這麼做?我寧願製作參數的類型ITestDataLoader並調用所需的方法。 – haiyyu 2012-02-22 16:27:54
我假設這是一個更復雜的委託注入模式的簡化例子。 – 2012-02-22 16:49:53
你是對的Steve。我發現我一遍又一遍地做同樣的事情來創建一個報告:加載數據(每次不同的方法),使用另一個對象返回一些項目,然後使用第三個對象來生成一個報告(每次不同) 。所以我重構了:將共同的邏輯拉成一個私人方法,以函數或動作作爲參數。然後我用自己的測試把這個私有方法變成另一個類。它真的簡化了測試的負擔。 – 2012-02-23 14:35:36