- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 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);
我还发现了其他问题:
how to moq simple add function that uses Unit of Work and Repository Pattern
Mocking UnitOfWork with Moq and EF 4.1
但他们都没有帮助,我将不胜感激。
最佳答案
你快到了。两件事:
您确实需要设置 ContactRepository
属性,因为最小起订量不支持设置的“链接”。
此外,您需要使用 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/
我在 rspec 测试中 stub Figaro 有问题。我有这样的代码: class User < ActiveRecord::Base def ce_url_link path = F
我有一个使用 Asp.Net Core 创建的项目,但我在对 Controller 操作的一部分进行单元测试时遇到问题,我使用 xUnit.net(2.2.0-beta2-build3300)用于测试
我正在尝试在应用程序 Controller 上测试一种方法,该方法将用作前置过滤器。为此,我在测试中设置了一个匿名 Controller ,并应用了 before 过滤器以确保其正常运行。 目前的测试
我将 Capybara 与 selenium 和/或 capybara-webkit 驱动程序和 Webmock 一起用作 stub 框架。 当我使用 selenium (firefox) 运行 go
我是一名优秀的程序员,十分优秀!