我的测试类在其构造函数中使用了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