gpt4 book ai didi

c# - 在单元测试中处理 DateTime.Now 的策略

转载 作者:太空狗 更新时间:2023-10-30 00:16:54 25 4
gpt4 key购买 nike

我的业务逻辑在周六或周日不执行某些功能。我希望我的单元测试能够验证这些功能是否已执行,但测试将在周六/周日失败。

我认为最简单的方法是让单元测试传达一条友好的消息,说明如果在周六/周日运行测试结果无效。

使用 C#/NUnit...

Assert.That(
DateTime.Now.DayOfWeek != DayOfWeek.Sunday && DateTime.Now.DayOfWeek !=
DayOfWeek.Saturday, "This test cannot be run on Saturday or Sunday");

是否可以/建议尝试模拟日期?是否有其他策略来处理这种情况?

最佳答案

Is it possible/advisable to try and mock the date?

是的,这不仅是可取的,而且是独立可靠地对代码进行单元测试的唯一方法。假设您想测试以下(无意义的)方法:

public bool Foo()
{
return (DateTime.Now.DayOfWeek == DayOfWeek.Sunday);
}

很明显您无法测试它,因为它依赖于静态方法(更准确地说是静态 Now 属性)。很明显,像这样紧密耦合的组件不能单独进行单元测试。

现在考虑这种改进(与构造函数 DI 的关注点分离):

private readonly Func<DateTime> _nowProvider;
public SomeClass(Func<DateTime> nowProvider)
{
_nowProvider = nowProvider;
}

public bool Foo()
{
return (_nowProvider().DayOfWeek == DayOfWeek.Sunday);
}

现在,单元测试变得更好、更容易了。 SomeClass 不再依赖于不确定的日期。在实际应用程序中,您显然会像这样实例化 SomeClass:

var s = new SomeClass(() => DateTime.Now);
s.Foo();

并且在您的单元测试中,您将模拟它以便您可以验证这两种情况:

var subjectUnderTest = new SomeClass(() => new DateTime(2011, 1, 3));
var actual = subjectUnderTest.Foo();
// assertions, ...

关于c# - 在单元测试中处理 DateTime.Now 的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4594652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com