C#/.net 单元测试xUnit、Mock、Moq

举报
步步为营 发表于 2023/03/14 14:17:10 2023/03/14
【摘要】 C#/.net 单元测试xUnit、Mock、Moq

C#/.net 单元测试xUnit、Mock、Moq

在做单元测试的时候,有时需要引用很多的外部对象,例如网络通信、记录日志等。单元测试无法控制这些外部的依赖对象,所以需要使用Stub和Mock来模拟这些外部对象。

案例说明

用以下实例来进行单元测试

//检查文件名的长度,并使用IWebService来记录错误
public class CheckLength
{
    public IWebService webService { get; set; }
    public IEmailService emailService { get; set; }

    public void Analyze(string fileName)
    {
        if (fileName.Length<8)
        {
            webService.LogError("文件名称太短");
        }
        else
        {
            emailService.SendEmail("123@qq.com", "文件名符合要求");
        }
    }
}

我们发现webService和emailService都是外部依赖对象,需要我们自己写Stub和Mock来模拟这两个外部对象

public class StubWebService : IWebService
{
    public void LogError(string message)
    {
        Debug.WriteLine(message);
    }
}

public class MockEmailService : IEmailService
{
    public string Email { get; set; }
    public string message { get; set; }
    public void SendEmail(string email, string message)
    {
        this.Email= email;
        this.message = message;
    }
}

然后进行单元测试

[Fact()]
public void AnalyzeTest()
{
    //arange
    StubWebService stubService = new StubWebService();
    MockEmailService mockService = new MockEmailService();

    CheckLength checkLength = new CheckLength();
    //将自定义的服务赋给checkLength
    checkLength.emailService = mockService;
    checkLength.webService= stubService;

   
    //act
    string fileName = "a3t";
    checkLength.Analyze(fileName);

	//assert
    Assert.Equal("123@qq.com", mockService.Email);
    Assert.Equal("文件名符合要求", mockService.message);
}

stub和Mock的区别

从上面可以看出,Stub是完全模拟一个外部依赖(直接输出,无法进行断言),而Mock则是用来断言

注意事项:

要以接口为依赖对象,例如本案例中

public IWebService webService { get; set; }
public IEmailService emailService { get; set; }

Moq是.net平台下的一个非常流行的模拟库,目前依赖注入模式非常流行,有时被测试的类或者方法需要注入数十项接口,如果像上面那样将接口重写为自定义的“假实现”,也要写大量的代码,而利用moq框架可以自动生成接口的代理对象,减少工作量。

moq框架教程

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。