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

14 浏览
0 Comments

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

我正在学习TDD。我了解到依赖注入的概念,即将类的依赖项放在构造函数的参数中,并通过构造函数传入,默认构造函数会传入默认实现,例如:

public AccountController() : this(RepositoryFactory.Users())
{
}
public AccountController(IUserRepository oUserRepository)
{
    m_oUserRepository = oUserRepository;
}

RepositoryFactory是一个简单的静态类,用于返回当前构建的所选实现。

但是默认的ASP.NET MVC Web应用项目不这样做,相反,依赖注入采用了在测试类的对象初始化器中分配的公共属性的形式,例如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类有两种依赖注入的方法。我应该使用哪一种?构造函数注入还是公共属性?

我正在考虑使用构造函数注入...

ASP.NET MVC使用公共属性的方式是因为需要提供一种特定的方式来注入到构造函数中,而基本的“创建新的”Web应用程序需要作为起点的通用性。

0
0 Comments

自动化测试是软件开发过程中的重要环节,可以确保代码的质量和功能的正确性。在ASP.NET MVC web项目中,单元测试类对于测试控制器类和其他业务逻辑代码非常有用。然而,有些开发者对于如何编写和组织单元测试类可能存在困惑。本文将探讨ASP.NET MVC web项目中单元测试类是否是一个好的例子,并提供一些解决方法。

在ASP.NET MVC web项目中,单元测试类的目的是验证控制器类和其他业务逻辑代码的功能是否正常。这些测试类通常使用框架如NUnit、xUnit或者MS Test来编写和执行测试。然而,有些开发者可能会对如何正确组织和编写这些测试类感到困惑。

问题的原因可能是开发者没有遵循良好的单元测试实践,或者没有理解ASP.NET MVC框架中单元测试类的用途和特点。解决方法包括学习和了解单元测试的基本概念和最佳实践,以及研究和借鉴其他开发者的经验和示例代码。

一个好的例子可以通过以下几个方面来评估:

1. 测试覆盖率:好的单元测试类应该覆盖项目中的所有重要功能和代码路径。开发者可以通过使用代码覆盖率工具来评估测试类的覆盖率。

2. 测试可读性和可维护性:好的单元测试类应该易于阅读和理解,同时也应该易于维护和扩展。开发者可以通过使用良好的命名约定、清晰的测试结构和注释来提高测试类的可读性和可维护性。

3. 测试代码质量:好的单元测试类应该遵循编码规范和最佳实践,同时也应该避免重复代码和冗余测试。开发者可以使用代码分析工具来评估测试代码的质量。

单元测试类在ASP.NET MVC web项目中是一个重要的组成部分。通过遵循最佳实践,开发者可以编写出高质量的测试类,并确保代码的质量和功能的正确性。

0
0 Comments

ASP.NET MVC网络项目中的单元测试类是一个很好的例子吗?

问题的出现的原因:

1. 使用默认构造函数和重载构造函数会引入歧义:类是控制自己的依赖关系,还是从外部获取依赖关系?显然,它无法做出决定。

2. 有一个默认实现会引入紧耦合,因为你无法在没有对其进行引用的情况下创建默认实现的新实例。然而,依赖注入的整个目的是实现松耦合。

解决方法:

1. 在大多数情况下,建议使用构造函数注入。它易于实现,并且具有非常强的语义:它强制消费者提供依赖关系的实例,从而明确表示依赖关系是必需的。

2. 相对地,属性注入意味着依赖关系是可选的,因为编译器不会强制你分配一个值。在大多数情况下,依赖关系实际上并不是可选的,因此应该很少使用这种模式。

文章如下:

ASP.NET MVC网络项目中的单元测试类是一个很好的例子吗?

问题的出现的原因:

1. 使用默认构造函数和重载构造函数会引入歧义:类是控制自己的依赖关系,还是从外部获取依赖关系?显然,它无法做出决定。

2. 有一个默认实现会引入紧耦合,因为你无法在没有对其进行引用的情况下创建默认实现的新实例。然而,依赖注入的整个目的是实现松耦合。

解决方法:

1. 在大多数情况下,建议使用构造函数注入。它易于实现,并且具有非常强的语义:它强制消费者提供依赖关系的实例,从而明确表示依赖关系是必需的。

2. 相对地,属性注入意味着依赖关系是可选的,因为编译器不会强制你分配一个值。在大多数情况下,依赖关系实际上并不是可选的,因此应该很少使用这种模式。

这个问题的出现的原因是ASP.NET MVC项目中的单元测试类的设计问题。使用默认构造函数和重载构造函数会引入歧义,无法确定类是控制自己的依赖关系还是从外部获取依赖关系。此外,有一个默认实现会引入紧耦合,因为无法在没有对其进行引用的情况下创建默认实现的新实例。然而,依赖注入的目的是实现松耦合。

为了解决这个问题,建议在大多数情况下使用构造函数注入。构造函数注入易于实现,并且具有非常强的语义,强制消费者提供依赖关系的实例,明确表示依赖关系是必需的。相比之下,属性注入意味着依赖关系是可选的,因为编译器不会强制分配一个值。然而,在大多数情况下,依赖关系实际上并不是可选的,因此应该很少使用这种模式。

ASP.NET MVC项目中的单元测试类并不是一个很好的示例,因为它们的设计存在问题。为了实现松耦合,应该使用构造函数注入而不是默认构造函数和重载构造函数。这样可以明确表示依赖关系是必需的,避免紧耦合的问题。这种设计方式能够更好地满足依赖注入的目的。

0