如何测试涉及数据库和Exchange Server Access的类?

时间:2010-12-15 13:00:38

标签: .net database web-services unit-testing testing

我刚刚在Nunit的c#中完成了测试驱动开发的教程。 我现在想为我的新项目使用单元测试,但是我在编写测试时遇到了困难。 如何为涉及数据库或Web服务访问的类编写单元测试? 有人能给我一些课/单元测试的例子吗?

1 个答案:

答案 0 :(得分:5)

  • 设计一个包含调用db,发送电子邮件,...
  • 功能的界面
  • 编写类的实现,并使用DI
  • 在依赖类中加载此类
  • 使用Mock框架创建一个Mock对象,并在单元测试中设置它的期望值。

这是一个示例伪代码(此处使用的模拟生成器是 Moq 框架):

interface IEmailer
{
    void Send(Email email);
}

class RealEmailer : IEmailer
{
    public void Send(Email email)
    {
        // send
    }
}

class UsesEmailer
{
    private IEmailer _emailer;

    public UsesEmailer(IEmailer emailer)
    {
        _emailer = emailer;
    }


    public foo(Email email)
    {
        // does other stuff
        // ...
        // now sends email
        _emailer.Send(email);
    }

}

class MyUnitTest
{
    [Test]
    public Test_foo()
    {
        Mock<IEmailer> mock = new Mock<IEmailer>();
        Email m = new Email();
        mock.Expect(e => e.Send(It.Is<Email>(m)));
        UsesEmailer u = new UsesEmailer(mock.Object);
        u.Send(m);
        mock.Verify();
    }

}

<强>更新

现在,如果您正在测试RealEmailer,有几种方法,但基本上您必须设置测试以向您发送电子邮件并且您签入。这不是一个单元测试,因为你不仅要测试你的代码,还要测试配置,网络,交换服务器......实际上如果你让RealEmailer只有很少的代码,你可以跳过为它编写单元测试