gpt4 book ai didi

c# - 带有 Moq 的 Stubed 工作单元方法不返回预期的整数

转载 作者:行者123 更新时间:2023-11-30 16:01:15 25 4
gpt4 key购买 nike

我有一个使用 Asp.Net Core 创建的项目,但我在对 Controller 操作的一部分进行单元测试时遇到问题,我使用 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();
}
}

我将工作单元注入(inject)我的 Controller ,我的操作:

 [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");
}
}

我想做的是 stub 我的 AddNewContactAsync 方法返回一个大于 0 的整数(在本例中为 10),插入 if 子句,并测试是否正确的 View 是返回,我的测试类:

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,而我的测试没有进入导致return View("Success")的if条件,我知道问题所在与 ReturnAsync 无关,因为我已经将它与其他异步方法一起使用并且它有效,而且 _webForMapper 被正确 stub 并将 View 模型映射到我的域模型并且 contactWioutJavascript 填充了值,但是当我调试测试并到达 addContactResultWioutJavascript 行时,无论我做什么,它都返回 0。

我做了但没有奏效的事情:

我 mock 了 ContactRepository,并尝试将其 stub :

_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

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

最佳答案

你快到了。两件事:

  1. 您确实需要设置 ContactRepository属性,因为最小起订量不支持设置的“链接”。

  2. 此外,您需要使用 It.IsAny<>()而不是 A.New<>() :

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

    这表示“匹配传入的任何 Contact”。当你使用 A.New<>() ,你说的是“匹配我刚刚用 Contact 创建的 A.New<>() 实例。实际上,这永远不会匹配任何东西,因为你没有保存或使用 A.New<>() 的返回值。

    <

关于c# - 带有 Moq 的 Stubed 工作单元方法不返回预期的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38903296/

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