gpt4 book ai didi

c# - 结合单元测试(模拟)和依赖注入(inject)框架

转载 作者:太空狗 更新时间:2023-10-29 19:56:09 24 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Using IoC for Unit Testing

我想我在理解单元测试和/或依赖注入(inject)的工作方式时确实有问题。我使用 NUnit 和 Rhino Mocks 进行单元测试,并使用 Ninject 作为依赖注入(inject)框架。总的来说,我虽然这两个非常适合 - 但不知何故,它似​​乎变得更加复杂和难以理解。

(我会尝试编一个很好的例子,让它简洁明了。这是关于我,骑自行车)。

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");
}
}

要骑我的自行车,我只需要:new Person().Travel();

2.) 使用 DI:
我不想要那种紧密的耦合,所以我需要一个接口(interface)和一个 NinjectModule!我会有一些开销,但那会很好,只要代码易于阅读和理解。我将只传递修改后的 Person 类的代码,Bike 类没有改​​变:

public class Person
{
IKernel kernel = new StandardKernel(new TransportationModule());
public void Travel()
{
ITransportation transportation = kernel.Get<ITransportation>();
transportation.Ride();
}
}

我仍然可以骑自行车:new Person().Travel();

3.) 考虑单元测试(无 DI):
为了能够检查 Ride-Method 是否被正确调用,我需要一个 Mock。据我所知,注入(inject)接口(interface)通常有两种方法:构造函数注入(inject)Setter 注入(inject)。我为示例选择构造函数注入(inject):

public class Person
{
ITransportation transportation;

public person(ITransportation transportation)
{
this.transportation = transportation;
}

public void Travel()
{
transportation.Ride();
}
}

这一次,我需要通过自行车:new Person(new Bike()).Travel();

4.) 使用 DI 并准备单元测试
3 中的类。考虑单元测试(无 DI) 无需修改即可完成工作,但我需要调用 new Person(kernel.Get<ITransportation>()); .通过这种方式,感觉就像我失去了 DI 的好处 - Person 类可以在没有任何耦合的情况下调用 Travel 并且不需要知道运输是什么类型。另外,我认为这种形式缺乏示例 2 的很多可读性。

这是怎么做到的?还是有其他更优雅的方式来实现依赖注入(inject)和单元测试(和模拟)的可能性?

(回过头来看,这个例子好像真的很糟糕——大家应该知道他此刻乘坐的是什么交通工具吧……)

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com