我正试图通过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'
我知道我错过了某个地方的船,但我不知道在哪里......任何想法?
答案 0 :(得分:8)
改变这个:
var controller = new ExtensionController(repos);
到此:
var controller = new ExtensionController(repos.Object);
PS:我知道这很糟糕,但这就是Moq的设计方式。