首次测试(VS2010 C#)

the*_*dev 3 c# unit-testing visual-studio-2010 vs-unit-testing-framework

这是我第一次遇到单元测试,我试图理解如何在简单的日期验证中使用这个概念.

用户可以选择代表日期的ToDate,直到可以进行付款.如果我们的日期无效,则无法付款.

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

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

问候,

亚历克斯

谢谢你的回答:

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

public bool IsDateValid(DateTime toDate)
{
    return (Manager.MaxToDate < toDate.Year);
}
Run Code Online (Sandbox Code Playgroud)

gor*_*gor 5

对的,这是可能的.但是单元测试改变了你班级的设计.要对此代码进行单元测试,您应进行以下更改:

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

  2. 将此方法的所有外部依赖项提取到接口,以便您可以模拟它们.然后你可以使用一些模拟库(moq,Rhino.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');
    }
}
Run Code Online (Sandbox Code Playgroud)

测试:

[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())
    }
}
Run Code Online (Sandbox Code Playgroud)

通过测试引入的设计更改为您提供了良好的系统解耦.当外部依赖项未写入事件时,可以为特定类编写测试.