C# 单元测试MVC5控制器使用工作单元和存储库创建操作
我正在尝试测试一个接受视图模型并创建新条目的控制器操作。以下是控制器操作:C# 单元测试MVC5控制器使用工作单元和存储库创建操作,c#,asp.net-mvc,unit-testing,moq,C#,Asp.net Mvc,Unit Testing,Moq,我正在尝试测试一个接受视图模型并创建新条目的控制器操作。以下是控制器操作: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(ContactViewModel viewModel) { if (!ModelState.IsValid) return View("Create", viewModel); _unitOfWork.Contacts.Add(Mapper.Map(viewM
[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.com");
}
[TestMethod]
public void CreatePost_ValidValuesSubmitted_ShouldCallComplete()
{
var viewModel = new ContactViewModel()
{
FirstName = "a",
LastName = "b"
};
_controller.Create(viewModel);
_mockRepository.Object.GetContacts(_userId).Should().HaveCount(1);
}
}
[TestClass]
公共类ContactControllerTests
{
专用接触器控制器;
私有模拟库;
私有字符串_userId;
私人模拟;
[分类初始化]
公共静态void Init(TestContext上下文)
{
初始化(c=>c.AddProfile());
}
[测试初始化]
public void TestInitialize()
{
_userId=“1”;
_mockRepository=newmock();
_mockUoW=新Mock();
_SetupGet(u=>u.Contacts).Returns(\u mockRepository.Object);
_控制器=新联系人控制器(\u mockUoW.Object);
_controller.MockCurrentUser(_userId,“user@domain.com");
}
[测试方法]
public void CreatePost_有效值提交_ShouldCallComplete()
{
var viewModel=new ContactViewModel()
{
FirstName=“a”,
LastName=“b”
};
_创建(视图模型);
_mockRepository.Object.GetContacts(_userId.Should().HaveCount(1);
}
}
单元测试总是返回计数0,而我希望它是1。我是TDD的新手,我实现了工作单元和存储库模式,如Mosh Hamedani的课程所示:
在上述示例中,您没有模拟存储库的任何行为 根据提供的示例,让我们假设这样一个简单的接口
public interface IContactRepository {
void Add(Contact contact);
IEnumerable<Contact> GetContacts(string _userId);
}
公共接口IContactRepository{
无效添加(联系人);
IEnumerable GetContacts(字符串_userId);
}
您需要为数据提供某种形式的存储
[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.com");
}
[测试初始化]
public void TestInitialize(){
_userId=“1”;
var data=new List();//用于存储测试数据。
//配置存储库
_mockRepository=newmock();
_mockRepository.Setup(m=>m.Add(It.IsAny()).Callback(data.Add);
_mockRepository.Setup(m=>m.GetContacts(_userId)).Returns(数据);
//配置UoW
_mockUoW=新Mock();
_SetupGet(u=>u.Contacts).Returns(\u mockRepository.Object);
_控制器=新联系人控制器(\u mockUoW.Object);
_controller.MockCurrentUser(_userId,“user@domain.com");
}
或者放弃模仿,创造一个假象
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;
}
}
公共类FakeContactRepository:IContactRepository{
私有i收集数据;
公共FakeContactRepository(ICollection数据){
这个数据=数据;
}
公共无效添加(联系人){
数据。添加(联系人);
}
公共IEnumerable GetContacts(字符串_userId){
返回数据;
}
}
为测试做准备
[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.com");
}
[测试初始化]
public void TestInitialize(){
_userId=“1”;
var data=new List();//用于存储测试数据。
//配置存储库
var fakeRepository=新的FakeContactRepository(数据);
//配置UoW
_mockUoW=新Mock();
_SetupGet(u=>u.Contacts).Returns(fakeRepository);
_控制器=新联系人控制器(\u mockUoW.Object);
_controller.MockCurrentUser(_userId,“user@domain.com");
}
如果您试图测试一段已经编写好的代码,那么它不是TDD(测试驱动的)。。。