我已经开始了漫长而艰巨的学习和将测试驱动程序应用到我的工作流程中的探索。我的印象是,测试驱动开发非常符合IoC原则。
在浏览了SO中的一些TDD标记问题后,我读到了针对接口而不是对象进行编程的好主意。
您能否提供简单的代码示例,说明这是什么,以及如何将其应用于实际用例?简单的例子是我(和其他想要学习的人)掌握概念的关键。
发布于 2010-12-16 08:44:05
考虑一下:
class MyClass
{
//Implementation
public void Foo() {}
}
class SomethingYouWantToTest
{
public bool MyMethod(MyClass c)
{
//Code you want to test
c.Foo();
}
}
因为MyMethod
只接受一个MyClass
,所以如果你想用一个模拟对象替换MyClass
来进行单元测试,你不能。更好的方法是使用一个接口:
interface IMyClass
{
void Foo();
}
class MyClass : IMyClass
{
//Implementation
public void Foo() {}
}
class SomethingYouWantToTest
{
public bool MyMethod(IMyClass c)
{
//Code you want to test
c.Foo();
}
}
现在可以测试MyMethod
了,因为它只使用一个接口,而不是特定的具体实现。然后,您可以实现该接口来创建用于测试目的的任何类型的mock或fake。甚至还有像Rhino Mocks的Rhino.Mocks.MockRepository.StrictMock<T>()
这样的库,它可以接受任何接口并为您动态构建一个模拟对象。
发布于 2010-12-16 08:59:54
这都是亲密关系的问题。如果您为实现(已实现对象)编写代码,那么您与“其他”代码处于非常密切的关系中,因为它是它的消费者。这意味着你必须知道如何构造它(即,它有什么依赖关系,可能作为构造函数参数,可能作为setter),何时处理它,如果没有它,你可能做不了什么。
实现的对象前面的接口允许您做一些事情-
通信
** UPDATE ** IOC Container (Factory)示例请求。有许多适用于几乎所有平台的,但它们的核心是这样工作的:
它可能看起来像这样:
IocContainer container = new IocContainer();
//Register my impl for the Service Interface, with a Singleton policy
container.RegisterType(Service, ServiceImpl, LifecyclePolicy.SINGLETON);
//Use the container as a factory
Service myService = container.Resolve<Service>();
//Blissfully unaware of the implementation, call the service method.
myService.DoGoodWork();
发布于 2010-12-16 08:47:21
在对接口进行编程时,您将编写使用接口实例而不是具体类型的代码。例如,您可以使用以下模式,其中包含构造函数注入。构造函数注入和控制反转的其他部分并不是针对接口进行编程所必需的,但是,由于您是从测试驱动程序和IoC的角度出发的,所以我已经用这种方式将其连接起来,为您提供一些您希望熟悉的上下文。
public class PersonService
{
private readonly IPersonRepository repository;
public PersonService(IPersonRepository repository)
{
this.repository = repository;
}
public IList<Person> PeopleOverEighteen
{
get
{
return (from e in repository.Entities where e.Age > 18 select e).ToList();
}
}
}
仓库对象是传入的,并且是一个接口类型。传入接口的好处是能够在不改变使用的情况下“交换出”具体的实现。
例如,假设在运行时,IoC容器将注入一个连接到数据库的存储库。在测试期间,您可以传入模拟或存根存储库来测试您的PeopleOverEighteen
方法。
https://stackoverflow.com/questions/4456424
复制相似问题