c# - 使用我无法修改的类的私有(private)构造函数模拟对象

标签 c# testing mocking

我面临以下问题: 我正在使用一个设计非常糟糕的 API(没有其他选择,使用不同的 API 不是一种选择),我想编写一些测试,但它们依赖于一个类的实例,我们称之为 A,具有私有(private)构造函数。

我需要模拟那个A,我根本不关心原来的行为,问题是我不能改变原来的类。

我有哪些选择?来自非静态类型的 ruby​​,我认为没有办法做到这一点,所以我不知道如何提出这个问题。

这不是我第一次有一个不是单例的类的私有(private)构造函数(可能它不是私有(private)的,它是内部的,但无论如何我无权访问它)

最佳答案

我在处理遗留代码时遇到过这个问题,这导致了经典的先有鸡还是先有蛋的问题:除非你有测试,否则你无法更改代码,但如果不更改代码,你就无法编写测试。

我使用 Microsoft Fakes 找到了出路,它可以模拟几乎所有东西,包括私有(private)构造函数。遗憾的是,它仅包含在 Visual Studio 的高级版和终极版(非专业版)中。如果你没有那个,一切都不会丢失 -- Moles ,最终催生假货的研究项目,仍然可以免费下载,并且工作原理基本相同。

我应该指出,一旦您能够使用 Fakes/Moles 可靠地编写测试和更改代码,最好的办法就是使用这种新功能使 API 更易于测试,如果只是因为 Fakes/Moles 是相当慢,并且会增加测试过程的开销。

关于c# - 使用我无法修改的类的私有(private)构造函数模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26399071/

相关文章:

c# - 我可以使用 ExecuteScalar 进行更新吗?

javascript - 如何使用 Testcafe 自动化移动虚拟设备测试

selenium - Gherkin 机器人框架中的场景概述

ruby - 在 RSpec Controller 规范中重构模拟

ios - 如何创建在触发功能时通过的测试?

java - 如果方法在使用 Powermock 进行单元测试期间调用,如何有效验证方法

c# - EWS foreach 所有未读邮件不起作用

c# - 如何将日期时间变量与 lambda 表达式进行比较?

c# - 定义有时在 int 和字典之间变化的 C# 类

ruby - 如何测试其中包含 gets.chomp 的函数?