单元测试MVC 5控制器使用工作单元和存储库创建操作

编程入门 行业动态 更新时间:2024-10-27 06:35:13
本文介绍了单元测试MVC 5控制器使用工作单元和存储库创建操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试测试接受视图模型并创建新条目的控制器动作.这是控制器动作:

I am trying to test a controller action that accepts a view model and creates a new entry. Here is the controller action:

[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(ContactViewModel viewModel) { if (!ModelState.IsValid) return View("Create", viewModel); _unitOfWork.Contacts.Add(Mapper.Map(viewModel, new Contact())); _unitOfWork.Complete(); return RedirectToAction("Index"); }

以及单元测试:

[TestClass] public class ContactControllerTests { private ContactsController _controller; private Mock<IContactRepository> _mockRepository; private string _userId; private Mock<IUnitOfWork> _mockUoW; [ClassInitialize] public static void Init(TestContext context) { Mapper.Initialize(c => c.AddProfile<MappingProfile>()); } [TestInitialize] public void TestInitialize() { _userId = "1"; _mockRepository = new Mock<IContactRepository>(); _mockUoW = new Mock<IUnitOfWork>(); _mockUoW.SetupGet(u => u.Contacts).Returns(_mockRepository.Object); _controller = new ContactsController(_mockUoW.Object); _controller.MockCurrentUser(_userId, "user@domain"); } [TestMethod] public void CreatePost_ValidValuesSubmitted_ShouldCallComplete() { var viewModel = new ContactViewModel() { FirstName = "a", LastName = "b" }; _controller.Create(viewModel); _mockRepository.Object.GetContacts(_userId).Should().HaveCount(1); } }

单元测试总是返回计数0,而我希望它是1.我对TDD还是很陌生,我实现了工作单元和存储库模式,如Mosh Hamedani的课程中所示: app.pluralsight/library/courses/full-stack-dot-net-developer-architecture-testing/目录表

The unit test always returns the count 0 while I expect it to be 1. I am pretty new to TDD and I implemented unit of work and repository pattern as shown in Mosh Hamedani's course at: app.pluralsight/library/courses/full-stack-dot-net-developer-architecture-testing/table-of-contents

推荐答案

在上面的示例中,您尚未嘲笑存储库的任何行为.

You have not mocked any behavior for the repository in the above example.

基于提供的示例,让我们假设一个像这样的简单接口.

Based on provided example, let's assume a simple interface like this.

public interface IContactRepository { void Add(Contact contact); IEnumerable<Contact> GetContacts(string _userId); }

您需要某种形式的数据存储.

You need to have some form of storage for your data.

[TestInitialize] public void TestInitialize() { _userId = "1"; var data = new List<Contact>();//To store test data. //Configure repository _mockRepository = new Mock<IContactRepository>(); _mockRepository.Setup(m => m.Add(It.IsAny<Contact>())).Callback<Contact>(data.Add); _mockRepository.Setup(m => m.GetContacts(_userId)).Returns(data); //Configure UoW _mockUoW = new Mock<IUnitOfWork>(); _mockUoW.SetupGet(u => u.Contacts).Returns(_mockRepository.Object); _controller = new ContactsController(_mockUoW.Object); _controller.MockCurrentUser(_userId, "user@domain"); }

或放弃该模拟并创建一个假货.

or forego the mock and create a fake.

public class FakeContactRepository : IContactRepository { private ICollection<Contact> data; public FakeContactRepository(ICollection<Contact> data) { this.data = data; } public void Add(Contact contact) { data.Add(contact); } public IEnumerable<Contact> GetContacts(string _userId) { return data; } }

并进行测试.

[TestInitialize] public void TestInitialize() { _userId = "1"; var data = new List<Contact>();//To store test data. //Configure repository var fakeRepository = new FakeContactRepository(data); //Configure UoW _mockUoW = new Mock<IUnitOfWork>(); _mockUoW.SetupGet(u => u.Contacts).Returns(fakeRepository ); _controller = new ContactsController(_mockUoW.Object); _controller.MockCurrentUser(_userId, "user@domain"); }

更多推荐

单元测试MVC 5控制器使用工作单元和存储库创建操作

本文发布于:2023-11-06 22:23:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1564835.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:控制器   单元测试   操作   工作   MVC

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!