我想我有一个问题理解的方式单元测试和/或依赖注入是加工。我正在使用NUnit和Rhino Mocks进行单元测试,并将Ninject用作依赖方式框架。总的来说,我认为虽然这两种方法都适合完美 - 但不知何故,它似乎变得更加复杂和难以理解。 (我会试着做一个很好的例子,保持它的干净和容易,这是关于我,骑自行车)。
1)无DI /单元测试:
不知道DI和单元测试的,我的代码看起来会是这样的 - 我会很高兴:
public class Person
{
public void Travel()
{
Bike bike = new Bike();
bike.Ride();
}
}
public class Bike
{
public void Ride()
{
Console.WriteLine("Riding a Bike");
}
}
要骑我自行车我只是需要:随着DI new Person().Travel();
2):
我不希望这样的紧耦合,所以我需要一个接口和一个NinjectModule!我会有一些开销,但只要代码易于阅读和理解,就没有问题。我只是通过代码修改的Person类,自行车类是不变的:
public class Person
{
IKernel kernel = new StandardKernel(new TransportationModule());
public void Travel()
{
ITransportation transportation = kernel.Get<ITransportation>();
transportation.Ride();
}
}
我仍然可以骑我的自行车刚:new Person().Travel();
3)考虑到单元测试(不DI):
为了能够检查乘车方法是否正确调用,我需要一个模拟。据我所知,通常有两种注入接口的方法:构造注入和注入注入。我选择构造器注入我的例子:
public class Person
{
ITransportation transportation;
public person(ITransportation transportation)
{
this.transportation = transportation;
}
public void Travel()
{
transportation.Ride();
}
}
这一次,我会NEET通过自行车:new Person(new Bike()).Travel();
4)随着DI和单元测试
在类准备3.考虑单元测试(无DI)将不做修改地完成这项工作,但我需要致电new Person(kernel.Get<ITransportation>());
。通过这一点,感觉就像我放弃了DI的好处 - 人员类可以称之为旅行,不需要任何耦合,并且需要知道交通是什么类。另外,我认为这种形式缺少很多示例2的可读性。
这是怎么完成的?还是有其他 - 更优雅的方式实现依赖注入和单元测试(和模拟)的可能性?
(回想起来,这个例子看起来很糟糕 - 每个人都应该知道他目前骑着什么样的运输工具......)
我想你可能会对依赖注入(DI)和控制反转(IoC)的定义感到困惑。你是第三个数字*实现DI(你已经将依赖关系移出构造函数),第二个数字是使用IoC(Ninject)容器来解决依赖关系。 – 2012-02-22 14:13:58
zapthedingbat是对的。你在第三个例子中做DI,但不要使用DI容器,这很好。 DI容器在进行DI时是可选的。 – Steven 2012-02-22 14:18:22
示例“2.”不使用DI,而是一个“服务定位器”... – 2012-08-24 13:11:17