使用存储库模式进行ASP.NET MVC单元测试

时间:2011-03-30 19:19:05

标签: asp.net-mvc unit-testing nunit-2.5

我正试图通过asp.net mvc3和单元测试来解决问题。

我创建了一个使用存储库模式的模型。这是界面:

public interface IExtensionRepository
{
    IList<Extensions> ListAll();
}

这是存储库:

public class ExtensionRepository : IExtensionRepository
{
    private ExtensionsLSDataContext _dataContext;

    public ExtensionRepository()
    {
        _dataContext = new ExtensionsLSDataContext();
    }

    public IList<Extensions> ListAll()
    {
        var extensions = from ext in _dataContext.Extensions
                         select ext;
        return extensions.ToList();
    }

}

这是控制器:

public class ExtensionController : Controller
{

    private IExtensionRepository _repository;

    public ExtensionController()
        : this(new ExtensionRepository())
    {

    }

    public ExtensionController(IExtensionRepository repository)
    {
        _repository = repository;
    }
 }

页面似乎按设计运行。然而,事情在我的单元测试中误入歧途。它驻留在同一解决方案中的另一个项目中。我正在使用Moq和NUnit。这是我的测试:

    [Test]
    public void Test_Extension_Index_Views()
    {
        Mock<Extensions> extension = new Mock<Extensions>();
        List<Extensions> extList = new List<Extensions>();
        extension.Object.Extension = "5307";
        extension.Object.Extension_ID = 1;
        extension.Object.ExtensionGroup_ID = 1;
        extList.Add(extension.Object);

        Mock<IExtensionRepository> repos = new Mock<IExtensionRepository>();
        repos.Setup(er => er.ListAll()).Returns(extList);

        var controller = new ExtensionController(repos);                       


        var result = controller.Index() as ViewResult;
        Assert.AreEqual("Index", result.ViewName);
    }

对于以“var controller ...”开头的行,我收到以下错误:

  

最佳重载方法匹配   'MvcApplication1.Controllers.ExtensionController.ExtensionController(MvcApplication1.Models.IExtensionRepository)'   有一些无效的论点

  

参数1:无法转换   'Moq.Mock'   至   'MvcApplication1.Models.IExtensionRepository'

我知道我错过了某个地方的船,但我不知道在哪里......任何想法?

1 个答案:

答案 0 :(得分:8)

改变这个:

var controller = new ExtensionController(repos); 

到此:

var controller = new ExtensionController(repos.Object);
PS:我知道这很糟糕,但这就是Moq的设计方式。

相关问题