【问题标题】:Visual Studio C# Unit TestsVisual Studio C# 单元测试
【发布时间】:2015-06-17 19:36:11
【问题描述】:

我正在尝试学习 C# 中的单元测试。但我不明白如何将测试方法与实际方法联系起来。在一个指南中,它告诉我右键单击方法名称并单击创建单元测试。我不这么认为。另一个告诉我在解决方案中创建一个单元测试项目并将我的其他项目添加到引用中。我仍然没有看到如何在测试项目中引用特定的方法或类进行测试。

我看到了它是如何工作的,而不是如何“定位”我想要测试的方法和类。由于我无法实例化它们,我不知道还能做什么。由于保护级别,我尝试实例化,但该类是公共的。我知道我不应该更改单元测试项目的测试类的命名空间,但我不知道还能做什么。

我一直在阅读教程,但似乎没有他们所说的那样有效。

请给我一个简单的解释和 C# 单元测试的简短示例。

例如 2 个项目,一个具有命名空间 BankCS 和类 BankAccount,另一个是 UnitTest1 命名空间和类 BankAccountTest。在 BankAccountTest 中,当我尝试在 BankAccountTest 中建立银行账户时,我得到 BankCS.BankAccount.BankAccount() is inaccessible due to its protection level

从这行代码:var ba = new BankCS.BankACcount()

尝试将命名空间更改为与我正在测试的项目相同,但没有任何区别。

编辑:

我修复了错误,但仍然得到 System.Object 是在未引用的组件中定义的。您必须添加对程序集 System.Runtime.... 的引用。

不知道怎么做,在任何地方都看不到。

我也了解单元测试,我在 Python 中经常使用它们。但是在 Visual Studio 和 C# 中使用它们有很大不同。这就是为什么我会欣赏一个简短的例子。另外,为什么一个教程说右键单击该方法并单击创建单元测试,我从未见过该选项只是运行测试和调试测试。

似乎我的问题是,能够在我的单元测试项目中实例化我想要测试的内容,有什么建议吗?有什么陷阱吗?

【问题讨论】:

  • 在您的测试项目中,添加对“真实”项目的引用。右键单击引用 -> 添加引用 -> 项目 -> 解决方案 -> 检查您的“真实”项目。
  • 您使用的是哪个版本的 Visual Studio?
  • 从单元测试项目中引用项目并没有什么特别之处。你知道如何在 Visual Studio 中添加项目引用吗?你正在做的确切的事情是什么,它到底是如何失败的?如果将项目引用添加到要测试的代码,则可以执行该代码。 .NET 中的任何引用都是如此。
  • 使用 Visual Studio 2013
  • @David 我将项目引用添加到单元测试项目中。这就是为什么我想要一个简短的例子

标签: c# unit-testing visual-studio-2013


【解决方案1】:

BankCS.BankAccount.BankAccount() 由于其保护级别而无法访问

如果构造函数不是公共的,那么你不能从类外部访问它。这适用于所有 C# 代码(以及几乎一般的面向对象代码),与单元测试无关。

如果要创建一个对象的新实例,该对象需要一个公共构造函数:

public BankAccount()
{
    // constructor logic
}

请注意,默认情况下,C# 会为所有对象创建一个公共的、无参数的构造函数除非您提供了一个构造函数。因此,如果您提供的是非公开的:

private BankAccount() { /.../ }

那么就不会有默认的公开了。

【讨论】:

  • 这不是最好的解决方案,最好使用PrivateObject.GetFieldOrProperty()msdn.microsoft.com/en-us/library/ms243729.aspx
  • @fsacer:我看不出有什么更好的地方。它似乎在使用反射,这意味着您没有获得编译时类型安全。
  • 你不应该只为单元测试创​​建一个公共构造函数——这会以一种重要的方式影响你的公共 API。使用 PrivateObject 或将其设为内部并使用 [InternalsVisibleTo(string)]。
  • @JeroenVannevel:你也不应该尝试构造一个没有公共构造函数的对象。测试应该测试可见的功能。如果没有可见功能使用不可见功能,则可以安全地删除不可见功能,从而使问题变得毫无意义。像InternalsVisibleTo 这样的变通方法会在被测试的代码和测试之间产生脆弱的耦合。
  • @fsacer:很公平,但是如果没有公开的方式来创建您的类的实例,那么我认为根本没有充分的理由进行测试。
【解决方案2】:

最简单意义上的单元测试是指在部署代码之前使用自动化测试功能测试代码,而不是严格以用户身份手动运行代码测试。可以在此处找到有关为 C# 设置单元测试的易于理解的概述;

http://www.codeproject.com/Articles/391465/Creating-Unit-tests-for-your-csharp-code 还可以尝试通过 github 查找可以轻松实现的单元测试。

【讨论】:

    【解决方案3】:

    听起来您尝试访问的方法或类不是公开的。它是私有的、受保护的还是内部的?如果是这样,请将类和方法更改为 public。另一种选择是使用InternalVisibleToAttribute,这样您的测试就可以访问标记为内部的类/方法。

    【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多