gpt4 book ai didi

c# - 第一个单元测试(VS2010 C#)

转载 作者:行者123 更新时间:2023-11-30 13:41:37 25 4
gpt4 key购买 nike

这是我第一次接触单元测试,我试图了解如何将这个概念用于简单的日期验证。

用户可以选择一个 ToDate 来表示付款前的日期。如果我们的日期无效,则无法付款。

    private void CheckToDate(DateTime ToDate)
{
if (Manager.MaxToDate < ToDate.Year)
//show a custom message
}

在这种情况下如何使用单元测试?

问候,

亚历克斯

感谢您的回答:

正如你们许多人所建议的那样,我将拆分功能并将验证与消息显示分开,并为此使用单元测试。

public bool IsDateValid(DateTime toDate)
{
return (Manager.MaxToDate < toDate.Year);
}

最佳答案

是的,这是可能的。但是单元测试改变了你类(class)的设计。为了能够对该代码进行单元测试,您应该进行以下更改:

  1. 公开您的方法。 (可以使其受到保护,但为简单起见将其公开)。

  2. 将此方法的所有外部依赖项提取到接口(interface),以便您可以模拟它们。然后您可以使用一些模拟库(moqRhino.Mocks)来模拟真实的依赖关系并编写断言。

  3. 编写测试。

这里是示例代码。

被测类:

public class ClassUnderTest
{
public IManager Manager {get;set;}
public IMessanger Messanger {get;set}

public ClassUnderTest (IManager manager, IMessanger messanger)
{
Manager = manager;
Messanger = messanger;
}

private void CheckToDate(DateTime ToDate)
{
if (Manager.MaxToDate < ToDate.Year)
//show a custom message
Messanger.ShowMessage('message');
}
}

测试:

[TestFixture]
public class Tester
{
public void MessageIsShownWhenDateIsLowerThanMaxDate()
{
//SetUp
var manager = new Mock<IManager>();
var messanger = new Mock<IMessanger>();

var maxDate = DateTime.Now;

manager.Setup(m => m.MaxToDate).Returns(maxDate);

var cut = new ClassUnderTest (manager.Object, messanger.Object);

//Act
cut.CheckToDate();

//Assert
messanger.Verify(foo => foo.ShowMessage("message"), Times.AtLeastOnce())
}
}

通过测试引入的设计变更可以很好地解耦系统。当没有编写外部依赖项时,可以为特定类编写测试。

关于c# - 第一个单元测试(VS2010 C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5001310/

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