![]() |
1
182
这个 最好的 策略是 wrap the current time in an abstraction and inject that abstraction into the consumer . 替代地 也可以将时间抽象定义为 环境语境 :
这将使您能够像这样使用它:
在单元测试中,可以替换
但是,在静态单元测试时,请务必记住
拆下你的固定装置
通过呼叫
|
![]() |
2
47
这些都是很好的答案,这就是我在另一个项目上所做的: 用途: 获取今天的实时日期
而不是使用日期时间。现在,您需要使用
时间旅行(让我们未来5年)
得到我们的假“今天”(将从“今天”起5年)
重置日期
|
![]() |
3
23
鼹鼠:
免责声明-我在研究痣 |
![]() |
4
16
您可以选择:
一些例子: 使用moq的包装类:
直接使用隔离器伪造日期时间:
免责声明-我在typemock工作 |
![]() |
5
9
为系统添加假程序集(右键单击系统引用=>添加假程序集)。 写进你的测试方法:
|
![]() |
6
5
线程安全
使用实例:
|
![]() |
7
5
关于@crabcrusherclamCollector答案,在EF查询中使用该方法时会出现问题(System.NotSupportedException:Linq to实体中不支持Linq表达式节点类型“invoke”)。我将实现修改为:
|
![]() |
8
3
测试依赖于
我知道有两个框架可以做到这一点。 Microsoft fakes 和 Smocks . 微软的假货需要Visual Studio 2012的最后通牒,并且可以直接从康普顿公司工作。 Smocks是一个开放源代码,非常容易使用。它可以使用nuget下载。
以下是对
|
![]() |
9
2
模拟对象。 一个模拟日期时间,它返回一个适合您的测试的now。 |
![]() |
10
2
我也遇到过同样的问题,但发现微软的一个研究项目解决了这个问题。 http://research.microsoft.com/en-us/projects/moles/ Moles是一个轻量级的框架,用于测试.NET中基于委托的存根和迂回路线。moles可用于迂回任何.NET方法,包括密封类型中的非虚拟/静态方法。
示例代码是从原始代码修改而来的。 我做了其他人建议的事情,并将日期时间抽象为一个提供者。只是感觉不对,我觉得只是测试太多了。今晚我将把这个应用到我的个人项目中。 |
![]() |
11
2
我很惊讶没有人提出最明显的方法:
然后您可以简单地在您的测试双重中重写这个方法。
我也喜欢注射
编辑:对于任何感兴趣的人,这称为向类中添加一个“接缝”,在这个点上,您可以钩住它的行为来修改它(出于测试目的或其他目的),而不必更改类中的代码。 |
![]() |
12
2
一个关于模仿的特别说明
价值
这不起作用:
但是,这确实是:
|
![]() |
13
1
好的做法是,当DateTimeProvider实现IDisposable时。
接下来,您可以为单元测试注入假日期时间。
|
![]() |
14
0
我也遇到了同样的问题,但我想我们不应该在同一个类上使用set datetime。因为有一天它会导致误用。所以我使用了像
对于测试,在测试项目中生成了一个处理集合事务的助手,
关于代码
在测试中
但需要记住一件事,有时实际的日期时间和提供程序的日期时间不一样
我以为尊重是最大限度的 时间跨度.从毫秒(0.00002) . 但大多数时候甚至更少 在以下位置查找示例 MockSamples |
![]() |
15
0
未提及的另一种选择是将当前时间注入依赖方法:
内部变化对单元测试开放,无论是否并行。
这是基于以下原则:
根据类的用途,可能需要将这两个方法都公开。 |
![]() |
16
0
这是我对这个问题的回答。我将“环境上下文”模式与IDisposable结合起来。因此,可以在正常程序代码中使用datetimeprovider.current,在测试中使用using语句重写作用域。
下面是如何在单元测试中使用上面的datetimeprovider
|
![]() |
17
0
使用
我们搜索了
所以我们提出了自己的解决方案,这只取决于标准库的类型。我们使用的是
如何使用
如何注册AutoFac
( 对于未来的编辑器:在此处附加案例 ) 如何进行单元测试
|
![]() |
18
0
也许不太专业但更简单的解决方案可以在consumer方法中生成一个datetime参数。例如,不要像sampleMethod这样的make方法,而是使用参数来生成sampleMethod1。sampleMethod1的测试更容易
|
![]() |
19
0
一个干净的方法是注入virtualtime。它允许你控制时间。 首次安装virtualtime
例如,它允许在所有对datetime的调用中使时间加快5倍。
使时间变慢,如慢5倍
让时间静止
时间倒转还没有测试 下面是一个样本测试:
您可以在此处查看更多测试: datetime.now.tovirtualtime扩展为您提供的是ITIME的一个实例,您将它传递给依赖ITIME的方法/类。一些datetime.now.tovirtualtime在您选择的DI容器中设置。 下面是另一个注入到类控制器中的示例
|
![]() |
20
0
我们使用的是静态SystemTime对象,但在运行并行单元测试时遇到问题。我尝试使用Henk van Boeijen的解决方案,但在生成的异步线程之间出现了问题,最终使用AsyncLocal的方式与下面类似:
来源于 https://gist.github.com/CraftyFella/42f459f7687b0b8b268fc311e6b4af08 |
|
Titan · 断言在编写单元测试时“什么都没发生” 7 年前 |
![]() |
SmartestVEGA · 单元测试代码覆盖率应该包括什么? 7 年前 |
![]() |
deBloB · 使用mstest按类别过滤。exe和VS2017 7 年前 |
![]() |
Kjell Rilbe · 如何模拟通过反射找到的类? 7 年前 |