2009-12-03 73 views
0

欢迎任何帮助。如何实现和测试ASP.NET MVC FakeRepository

我正在学习使用ASP.NET MVC框架编写代码,我对此概念进行了销售。

我现在主要的绊脚石是如何设置和测试替换数据库的存储库。为了测试MVC应用程序,我创建了一个类并将其称为fakerepository.cs。此类实现IContactManagerRepository接口中的方法。

namespace MyTestMVCProject.Models 
{ 
    public class FakeContactManagerRepository : IContactManagerRepository 
    { 
     IList<Contact> _contacts = new List<Contact>(); 

     #region IContactManagerRepository Members 

     public Contact Create(Contact contact) 
     { 
      _contacts.Add(contact); 
      return contact; 
     } 

     public Contact Edit(Contact contact) 
     { 
      throw new NotImplementedException(); 
     } 

     public void Delete(int id) 
     { 
      throw new NotImplementedException(); 
     } 

     public IList<Contact> ListContacts() 
     { 
      return _contacts; 
     } 

     #endregion 
    } 
} 

在下面的尝试测试中,我想确保联系人已创建,ID值是正确的。

[Test] 
public void Test_02_ContactController_Passes_ViewData_To_Details_View() 
{ 
    // Arrange 
    ContactController _controller = new ContactController(); 

    // Act 
    var _contact = new Contact 
    { 
     Id = 1, 
     FirstName = "Donald", 
     LastName = "Duck" 
    }; 

    var _result = _controller.Create(_contact) as ViewResult; 
    var contact = _result.ViewData.Model as Contact; 

    // Assert 
    Assert.AreEqual(1, _contact.Id); 
} 

不幸的是,测试总是失败。

当然,我对测试很新,但我通过搜索谷歌并观看ASP.NET MVC视频,在短时间内找到了很多东西。

任何人都可以建议我如何测试一个fakerepository返回一个列表到ViewResult?

回答

2

测试可能看起来像:

[Test] 
public void PostingValidContactCreatesOneInRepositoryAndReturnsViewResult() 
{ 
    // Arrange 
    var controller = new ContactController(new FakeContactManagerRepository()); 

    // Act 
    var contact = new Contact 
    { 
     Id = 1, 
     FirstName = "Donald", 
     LastName = "Duck" 
    }; 

    var result = controller.Create(contact); 

    //Assert there is one created Contact in repository 
    Assert.AreEqual(1, Repository.ListContacts().Count()); 
    //Check if result is ViewResult 
    Assert.IsInstanceOfType(result,typeof(ViewResult)); 
    //Assert item Id is 1 
    Assert.AreEqual(1, Repository.ListContacts().First().ID); 
    //Check if posting valid contact doesn't invalidate model state 
    Assert.IsTrue(controller.ModelState.IsValid); 
} 

的ContactController必须采取IContactManagerRepository在构造

public ContactController(IContactManagerRepository repository); 

在测试中,你为它提供FakeContactManagerRepository,在实际使用你可以注入你的真实信息库。

编辑

你的错误是:

var contact = _result.ViewData.Model as Contact; 

发布联系人不在_result.ViewData.Model,但在创建函数的参数。

var _result = _controller.Create(_contact) as ViewResult; 

这不是错误,但你可以这样定义

var _result = _controller.Create(_contact) 

,检查的结果是正确的类型。

Assert.AreEqual(1, _contact.Id); 

这没有任何意义,您在_contact.Id之前分配了几行。您应该从存储库中取出联系人并进行检查。