2016-11-20 47 views
1

我试图测试接受视图模型并创建一个新条目的控制器动作。这里是控制器动作:单元测试MVC 5控制器使用工作单元和知识库创建动作

[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, "[email protected]"); 
    } 

    [TestMethod] 
    public void CreatePost_ValidValuesSubmitted_ShouldCallComplete() 
    { 
     var viewModel = new ContactViewModel() 
     { 
      FirstName = "a", 
      LastName = "b" 
     }; 

     _controller.Create(viewModel); 

     _mockRepository.Object.GetContacts(_userId).Should().HaveCount(1); 
    } 
} 

,而我希望它是1单元测试总是返回计数0我非常新的TDD和我实现工作单位和存储库模式,如Mosh Hamedani的课程所示: https://app.pluralsight.com/library/courses/full-stack-dot-net-developer-architecture-testing/table-of-contents

+1

如果您试图测试已经写好的代码片段,它不是TDD(测试*驱动*)。 –

回答

1

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

根据提供的示例,我们假设一个简单的界面。

public interface IContactRepository { 
    void Add(Contact contact); 
    IEnumerable<Contact> GetContacts(string _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, "[email protected]"); 
} 

或放弃模拟并制造假货。

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, "[email protected]"); 
} 
相关问题