c# - ASP.NET MVC web 项目中的单元测试类是一个很好的例子吗?

标签 c# asp.net-mvc dependency-injection tdd

我正在学习 TDD。我知道依赖注入(inject),你可以将类的依赖项放在构造函数的参数中并让它们传入,从默认构造函数传入默认实现,例如;

public AccountController() : this( RepositoryFactory.Users())
{
}

public AccountController( IUserRepository oUserRepository)
{
 m_oUserRepository = oUserRepository;
}

RepositoryFactory 是一个简单的静态类,它返回为当前构建选择的实现

但是默认的 ASP.NET MVC web 应用程序项目不会这样做,相反,DI 采用在测试类的对象初始值设定项中分配的公共(public)属性的形式,例如;来自 AccountController.cs :

protected override void Initialize(RequestContext requestContext)
{
 if (FormsService == null)
  { FormsService = new FormsAuthenticationService(); }
 if (MembershipService == null)
  { MembershipService = new AccountMembershipService(); }

 base.Initialize(requestContext);
}

在测试类 AccountControllerTest.cs 中:

private static AccountController GetAccountController()
{
 AccountController controller = new AccountController()
 {
  FormsService = new MockFormsAuthenticationService(),
  MembershipService = new MockMembershipService(),
  Url = new UrlHelper(requestContext),
 };
 //snip
}

所以现在我的 AccountController 类有两种依赖注入(inject)方法。我应该使用哪一个?构造函数注入(inject)还是公共(public)属性?

我在考虑构造函数注入(inject)...

ASP.NET MVC 之所以这样使用公共(public)属性,是因为您需要提供一种注入(inject)构造函数的特定方法,并且基本的“新建”Web 应用程序需要通用作为起点吗?

最佳答案

ASP.NET MVC 中的示例很好地演示了如何使用 DI

首先,使用默认构造函数和重载构造函数会引入歧义:类是控制自己的依赖项,还是从外部获取依赖项?显然,它不能真正决定。

其次,拥有默认实现会引入紧耦合,因为您无法在没有引用的情况下创建默认实现的新实例。然而,whole point of DI is to enable loose coupling .

不幸的是,我们经常看到这个成语。在 my book我称之为 Bastard Injection 反模式;我从 Oren Eini/Ayende Rahien 中提取了名称的许多自以为是的博客文章,其中 he walks through a very similar example .

作为一般性建议,我建议在绝大多数情况下使用构造函数注入(inject)。它易于实现并且具有很强的语义:它强制消费者提供依赖项的实例,有效地说明依赖项是强制性的。

Property Injection,另一方面,意味着依赖是可选的,因为编译器不会强制您分配一个值。在大多数情况下,依赖关系并不是真正可选的,因此应该很少使用这种模式。

关于c# - ASP.NET MVC web 项目中的单元测试类是一个很好的例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4771647/

相关文章:

asp.net-mvc - ASP.net razor::如何发送联系表单并且不刷新页面

c# - 如何对文件名进行编码以供下载?

c# - 如何根据字符串动态调用类?

c# - 应用设置c#的依赖注入(inject)实现

java - 向非 Spring 管理对象提供 Spring 管理对象?

c# - Xamarin.Forms:未命中 Android 断点

c# - Dapper 使用列表插入数据库

asp.net-mvc - 如何处理集合的每一行重复相同形式的 MVC 模型绑定(bind)前缀?

c# - 数据绑定(bind)到 xaml 中对象列表中的对象列表中的对象列表

JavaScript 日期格式转换。