问题标签 [testability]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
testability - 可测试的设计
我有一个 java 类,它有一个使用 Facade (Singleton) 创建的静态成员。
这里A类用作webservice(无状态bean)的成员变量。
我无法使用 EasyMock 测试此代码,因为无法覆盖 DataStore 实例。
有两种选择。
有一个构造函数采用 DataStore 的实例,该实例将设置为 db 成员变量。问题是我不希望 webservice 类知道创建了哪个数据存储实例。
提供一个额外的受保护的 Set 方法来覆盖 db 对象。这就是我在创建 DataStore 的 Easy Mock 对象并覆盖成员变量时使用的方法。设计是否正确。
其他的可能性是什么?
c++ - 在 C++ 项目中进行 TDD 是否可能/足够高效?
我想知道你们中是否有人在您的 c++ 项目中使用 TDD,以及与 C# 和 Java 等托管语言相比,它的性能如何。你们使用什么框架来自动化 C++ 项目的测试?
jquery - 如何测试使用 Request.Form 中的 JSON 字符串的控制器操作?
我有一个从域对象获取 JSON 数据Request.Form[0]
并调用域对象的操作。
我正在测试这个方法,但是设置Request.Form似乎是不可能的。
我可以将该方法提取到另一个接受它返回的字符串的方法,但这只是一个单行方法,并且 Action 仍然未经测试。
有没有一种方法可以测试这个或另一个更可测试的方法来从$.ajax()
调用中获取 JSON 数据?
c#-4.0 - MEF 和工厂模式
我正在尝试重构我的项目以提高可测试性,因此我正在引入一个抽象工厂。
我的应用程序使用ICrawlers
. 这些ICrawler
s 使用 3rd 方库来访问不同的来源,例如 twitter。
示例:我的 TwitterCrawler 使用TweetSharp访问 Twitter 数据。
我的第一个版本将 TweetSharp 客户端与 Crawler 强耦合。现在我将 TweetSharp 抽象为一个ITwitterClient
和一个TweetSharpTwitterClient
实现。
下一步是引入 aITwitterClientFactory
来DefaultTwitterClientFactory
创建TweetSharpTwitterClient
s。这应该使我更接近我的目标(可测试性),因为我可以将工厂切换到MockTwitterClientFactory
创建一个MockTwitterClient
,提供一些测试输出的工厂。
现在,让我来谈谈我的观点。我正在使用MEF进行依赖注入(但我对它很陌生)。我正在做的是这样的:
而我DefaultTwitterClientFactory
将自己导出到 MEF:
现在,虽然到目前为止这有效,但我的问题是,如何切换工厂?我怎样才能创建一个单元测试并使用MockClientFactory
而不是DefaultTwitterClientFactory
?
我的方法真的好吗?手动设置要使用的工厂是否更好?某处类似
... new TwitterCrawler(mockedTwitterClientFactory)
甚至
.... new TwitterCrawler(mockedTwitterClient)
?
这实际上只是将问题移到了 TwitterClient 之外,但我仍然必须在某个地方决定如何构建 ITwitterClient 以及为此目的使用什么工厂。
我是否应该更深入地研究 MEF(ExportProvider?)的机制?
dependency-injection - 在 Windows 客户端 (WPF) 应用程序中进行依赖注入的正确方法
我习惯于 Web 应用程序中的 IoC/DI - 主要是 Ninject 和 MVC3。我的控制器是为我创建的,填充了所有的依赖项、子依赖项等。
但是,在胖客户端应用程序中情况有所不同。我必须创建自己的对象,或者我必须恢复到服务定位器风格的方法,在这种方法中我要求内核(可能通过一些接口,以允许可测试性)给我一个完整的对象与依赖关系。
但是,我已经看到有几个地方将 Service Locator 描述为反模式。
所以我的问题是 - 如果我想在我的胖客户端应用程序中从 Ninject 中受益,有没有更好/更合适的方法来获得这一切?
- 可测试性
- 适当的 DI / IoC
- 尽可能少的耦合
请注意,我在这里讨论的不仅仅是 MVVM 以及将视图模型放入视图中。这具体是由需要从内核提供存储库类型对象触发的,然后从该存储库中获取注入功能的实体(数据当然来自数据库,但它们还需要一些对象作为参数,具体取决于状态世界,Ninject 知道如何提供)。我可以在不将存储库和实体都留下无法测试的混乱的情况下以某种方式做到这一点吗?
如果有任何不清楚的地方,请告诉我。谢谢!
编辑 7 月 14 日
我确信提供的两个答案可能是正确的。然而,我身体的每一根纤维都在与这种变化作斗争;其中一些可能是由于缺乏知识造成的,但还有一个具体原因是我无法看到这种做事方式的优雅之处;
我在最初的问题中没有很好地解释这一点,但问题是我正在编写一个库,该库将被几个(最初是 4-5 个,以后可能更多)WPF 客户端应用程序使用。这些应用程序都在相同的域模型等上运行,因此将它们全部保存在一个库中是保持 DRY 的唯一方法。然而,这个系统的客户也有可能编写他们自己的客户——我希望他们有一个简单、干净的库可以与之交谈。我不想强迫他们在他们的 Composition Root 中使用 DI(在他的书中使用 Mark Seeman 之类的术语)——因为与他们刚刚更新 MyCrazySystemAdapter() 并使用它相比,这使事情变得非常复杂。
现在,MyCrazySystemAdapter(之所以选择这个名字是因为我知道人们在这里会不同意我的观点)需要由子组件组成,并使用 DI 组合在一起。MyCrazySystemAdapter 本身不需要注入。它是客户端与系统对话时需要使用的唯一接口。因此,客户应该高兴地获得其中之一,DI 就像幕后发生的魔术一样,并且该对象由许多不同的对象使用最佳实践和原则组成。
我确实意识到这将是一种有争议的做事方式。但是,我也知道将成为此 API 客户的人。如果他们发现他们需要学习和连接 DI 系统,并在他们的应用程序入口点(组合根)中提前创建他们的整个对象结构,而不是新建一个对象,他们会给我中指和直接弄乱数据库并以您难以想象的方式搞砸事情。
TL;DR:提供结构合理的 API 对客户来说太麻烦了。我的 API 需要交付他们可以使用的单个对象——使用 DI 和适当的实践在幕后构建。现实世界有时会胜过将所有东西倒过来以忠于模式和实践的愿望。
java - 使用构造函数注入为可测试性构建的类的正确设计
假设我有这 3 层代码:
1. 数据库层 (ORM)
2. 业务逻辑
3. 应用程序
现在,我编写代码如下:
数据库层:
/li>
这主要对数据库进行 CURD 操作。BusinessLogic:
/li>
这包含调用数据库层和执行操作的实际逻辑。应用层:
/li>
调用业务逻辑并展示数据
现在如果你在应用层看到,它知道数据库层,这是错误的。它知道的太多了。
Misko Hevery说:构造函数注入很好。但如果我遵循这一点,我将如何实现抽象?Google Guice 如何在这方面为我提供帮助?
c# - 将一次性依赖项的构建移到哪里以提高可测试性?
在我的单元测试中,我使用和TestInitialize 之AssemblyInitialize
类的东西来配置我的测试。在我初始化一些用于创建服务的单例工厂、一个工作单元和存储库(全部通过 Unity/Dependency Injection)。在我的TestInitialize 中,我清除了他们必须确保每个测试可以独立运行的状态。ClassInitialize
AssemblyInitialize
通过 Stackoverflow,我找到了以下文章:编写可测试代码和如何考虑单元测试方面的“新”运算符。我不得不说他们改变了我对我编写的一些代码的看法,但我的头脑仍然嗡嗡作响。
例如,采用以下代码:
在这样的 aspx 页面中使用:
考虑到以前的文章,我应该如何更改这种类型?我应该将服务实例传递给 PrepareView 方法吗?但是我的 ASPX 页面必须了解服务、工厂和东西,并在使用后处理服务。
我应该如何处理我的 Singleton 工厂?让它成为类的属性并通过 Unity 注入它?
php - 构建一个更可测试的会话管理器
我正在开发一组组件(有望成为一个完整的框架),目前正在开发一个以提供 PHP 会话的抽象。
我试图使代码尽可能地可测试,但是根据定义,会话类将依赖于 $_SESSION 超全局形式的全局状态。
我试图以这样一种方式实现我的会话类,即 $ SESSION 和 session * 函数只在一个地方被调用,然后我可以在 PHPUnit 中覆盖它以进行测试,但我不禁想知道是否有更好的这样做的方式。
如果您可以建议一种更好的方法来制作可测试的会话课程,那么我将不胜感激您的任何意见。
为了测试,目前的计划是用一个只设置一个内部数组的方法替换 initStorage()。如果你能提出更好的方法,我很想听听。
asp.net-mvc - 如何抽象 Linq2SQL 以实现可测试性
我正在开发一个使用 Linq2SQL 进行数据访问的项目。该项目由一个 ASP.NET MVC 应用程序和 8 个类库组成。大多数类库都有自己的 L2S 数据类。
作为我正在做的工作的一部分,我试图让各种被测组件引入一些稳定性清理代码库,它目前大量使用静态类和方法,并且控制器具有使用的静态 DataContexts自始至终。
如何重构 L2S 使用,以便我可以测试控制器操作?
我已经在应用程序中引入了依赖注入来解耦其他一些服务,但我不希望 DataContext 作为控制器的依赖属性,因为我想控制 DataContext 及其 DataLoadOptions 的实例化。
我确实尝试过的一件事是利用 L2S 生成的部分类并向 DataContexts 添加一个接口,但我发现抽象冒泡它进入了应用程序,而不是停留在类库中。感觉这不是正确的做事方式,维护起来会很痛苦。有没有人用这种方法取得过任何特别的成功或失败?
c# - 用于 C# 代码的解析器来评估可测试性?
我正在尝试编写一个程序,该程序将允许我为其提供一组 C# 代码文件并分析它们的可测试性问题。我从前面链接中提供的 4 个开始。
最终目标是创建所有文件的报告,它们可能存在的任何可测试性问题,以及可能观察到这些问题的特定代码注释(如果适用)。我想要帮助的是选择一些工具来简化解析代码的工作;我可以将所有内容作为字符串读取,但在这种情况下很难对代码进行排序来分析它。
到目前为止,我已经评估了以下内容:
- FxCop(对任何不是 .dll 的东西都不起作用,一些测试项目是在其控制器或演示器中具有可测试逻辑的 Web 项目)
- 代码合同(不是我需要的;这无助于发现问题)
- Pex(同上)
- NRefactory(可能很有趣,但文档和使用信息不存在,并且演示已损坏,即使在 Windows 上安装了 gtk/mono)
- CSharpCodeProvider(.Parse 方法返回 NotImplementedException)
至于我在找什么:
我至少想检测基本的对象结构和访问器对象以在其中导航(例如,一个File对象具有一个带有Classes集合的Namespace属性,每个Class都有Members、Constructors和Methods的集合等)。显然,如果有工具可以变得越来越精细和详细,那将是惊人的,但只要有这些东西可以让我处理小的、集中的字符串,那将是天赐之物。
提前致谢。