Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试MVC5控制器使用工作单元和存储库创建操作_C#_Asp.net Mvc_Unit Testing_Moq - Fatal编程技术网

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(测试驱动的)。。。