【问题标题】:How to automatically test classes that use C# System Class Methods?如何自动测试使用 C# 系统类方法的类?
【发布时间】:2020-01-01 03:58:35
【问题描述】:

我想在一些从系统类调用方法的 C# 类上运行单元测试。具体来说,在这种情况下,Image.FromFile(); 当我构建我的主项目时,一切都编译并运行顺利,但是当我尝试运行这些自动化测试时,它说它找不到系统类。我如何帮助它“找到”我的主项目很容易找到的这些系统类?

我已尝试通过解决方案资源管理器添加对测试项目的引用,但程序集类神秘地不在可供选择的依赖项列表中。

这是单元测试:

[TestMethod]
public void initTest1()
{
    Assert.IsNotNull(new Managers());
}

这是 Managers 构造函数:

public Managers()
{
    //...//
    Image image = Image.FromFile("exit.png");
    //...//
}

我希望测试能够运行,但它却给了我这个错误:

Message: Test method ManagersTest.initTest1 threw exception: 
System.IO.FileNotFoundException: Could not load file or assembly 'System.Drawing.Common, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.

【问题讨论】:

  • 你应该把它模拟成它自己的服务。
  • @DanielA.White 你的意思是写我自己的模拟Image 类和FromFile() 方法?
  • 将其包装到自己的服务中。
  • @shieldgenerator7 您的代码与第 3 方实现问题紧密耦合,这使得孤立地测试您的代码变得困难。考虑重构代码以通过抽象来解耦这些问题。
  • @DanielA.White “将其包装到自己的服务中”是什么意思?把它放在自己的namespace?

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


【解决方案1】:

我想建议一个小的重构来利用构造函数注入,这应该会使您的单元测试更容易执行。

将您的 Manager 类重构为:

private Image Image { get; }

public Managers(Image image)
{
    //...//
    Image = image;
    //...//
}

然后你的消费类将通过var managers = new Managers(Image.FromFile("exit.png"));创建它

现在您可以使用像 Moq 这样的库来创建模拟图像。

[TestMethod]
public void initTest1()
{
    var image = new Mock<Image>();
    Assert.IsNotNull(new Managers(image.Object));
}

【讨论】:

  • 这不是问题的答案。除此之外,您的重构毫无意义。我怀疑 Managers 在单个 Image 实例上运行。而是您会封装从文件系统打开图像的过程。您仍然会将原始问题(无法引用System.Drawing)移至另一个单元测试。你也不能模拟Image
  • Moq 和大多数模拟框架也是为模拟接口而设计的。模拟类型必须至少公开虚拟成员。否则你不能模拟它(改变或伪造一种类型的行为)。 Image 既不是接口也不是抽象类,也不是公开任何虚拟成员,因为它不是为框架用户设计和扩展的。
  • @BionicCode 我同意你所指出的。除了关于Image 不是抽象类的部分之外,一切都是准确的。它是抽象的,但不会暴露任何有用的虚拟成员被覆盖。你所说的其他一切都是站得住脚的。 docs.microsoft.com/en-us/dotnet/api/…
  • 感谢您的尝试,但我不想那样重构,尤其是在阅读了 BionicCode 和 Nkosi 的 cmets 之后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多