ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-Moq的存根工作单元方法未返回预期的整数

2019-11-18 09:19:19  阅读:276  来源: 互联网

标签:asp-net-core net-core moq xunit2 c


我有一个使用Asp.Net Core创建的项目,但是我对控制器动作的一部分进行单元测试时遇到问题,我使用xUnit.net(2.2.0-beta2-build3300)进行测试,使用Moq(4.6.25-alpha)进行模拟,并使用FluentAssertions(4.13.0)GenFu(1.1.1)来帮助我进行测试,工作单元类(请注意,我将其缩减为与我的问题相关的内容):

public class UnitOfWork : IUnitOfWork
{

    private readonly WebForDbContext _context;

    public UnitOfWork(WebForDbContext context)
    {
        _context = context;
    }

     private IContactRepository _contactRepository;

     public IContactRepository ContactRepository
    {
        get
        {

            if (this._contactRepository == null)
            {
                this._contactRepository = new ContactRepository(_context);
            }
            return _contactRepository;
        }
    }
}

在我的ContactRepository中,我有:

public class ContactRepository:IContactRepository
{
    private WebForDbContext _context;

    public ContactRepository(WebForDbContext context)
    {
        _context = context;
    }

    public Task<int> AddNewContactAsync(Contact contact)
    {
        _context.Contacts.Add(contact);
        return _context.SaveChangesAsync();
    }
}

我将工作单元注入到我的控制器中,我的动作是:

 [HttpPost]
 [ValidateAntiForgeryToken]
 public async Task<IActionResult> Create(ContactViewModel contactViewModel)
  {
       var contactWioutJavascript = _webForMapper.ContactViewModelToContact(contactViewModel);

       int addContactResultWioutJavascript = await _uw.ContactRepository.AddNewContactAsync(contactWioutJavascript);

        if (addContactResultWioutJavascript > 0)
        {
            return View("Success");
        }
  }

我想做的是存根我的AddNewContactAsync方法以返回一个大于0的整数(在这种情况下为10),插入if子句,并测试看看是否返回了正确的视图,即我的测试类:

public class ContactControllerTests
{

 private Mock<IUnitOfWork> _uw;
 private Mock<IWebForMapper> _webForMapper;

    public ContactControllerTests()
    {
        _uw = new Mock<IUnitOfWork>();

        _webForMapper = new Mock<IWebForMapper>();
    }

   [Fact]
    public async Task Create_SouldReturnSuccessView_IfNewContactAdded()
    {
        var contactViewModel = A.New<ContactViewModel>();

        _webForMapper.Setup(s => s.ContactViewModelToContact(contactViewModel)).Returns(A.New<Contact>());

        _uw.Setup(u => u.ContactRepository.AddNewContactAsync(A.New<Contact>())).ReturnsAsync(10);

        var sut = new ContactController(_uw.Object, _webForMapper.Object);

        var result = (ViewResult)await sut.Create(contactViewModel);

        result.ViewName.Should().Be("Success");
    }
 }

但是方法AddNewContactAsync返回0,并且我的测试未输入导致返回View(“ Success”)的if条件,我知道该问题与ReturnAsync无关,因为我已将其与其他异步一起使用方法有效,并且_webForMapper也正确存根,并将视图模型映射到我的域模型,并使用值填充了contactWioutJavascript,但是当我调试测试并到达addContactResultWioutJavascript行时,无论我做什么,它都会返回0.

我做了但没用的事情:

我嘲笑了ContactRepository,并尝试对它进行存根:

_contactRepository.Setup(c => c.AddNewContactAsync(A.New<Contact>())).ReturnsAsync(10);

_uw.SetupGet<IContactRepository>(u => u.ContactRepository).Returns(_contactRepository.Object);

我还发现了其他问题:

Moq Unit of Work

how to moq simple add function that uses Unit of Work and Repository Pattern

Mocking UnitOfWork with Moq and EF 4.1

但是他们都没有帮助,我将不胜感激.

解决方法:

你快到了.两件事情:

>您确实需要设置ContactRepository属性,因为Moq不支持设置的“链接”.
>另外,您需要使用It.IsAny<>()而不是A.New<>():

_contactRepository.Setup(c => c.AddNewContactAsync(It.IsAny<Contact>())).ReturnsAsync(10);

这说“匹配传入的任何联系人”.当您使用A.New<>()时,您说的是“匹配我刚刚使用A.New<>()创建的Contact实例.实际上,由于您没有保存或使用,因此永远不会匹配任何东西. A.New<>()的返回值.

标签:asp-net-core,net-core,moq,xunit2,c
来源: https://codeday.me/bug/20191118/2027110.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有