【问题标题】:repository get an instance of a context from a bootstrap container存储库从引导容器中获取上下文的实例
【发布时间】:2023-04-05 09:12:01
【问题描述】:
存储库是 Mvc 控制器的一个道具,我正在尝试编写一个测试方法来检查这个控制器,
但我在容器调用中遇到错误...
我是 mvc 和测试新手.. 所以我不知道从哪里开始
我该怎么做?
这是测试的样子:
public void SomeTest()
{
var controller= new SomeController();
var result = SomeController.Index();
Assert.IsNotNull(result);
}
我在运行测试时收到的错误
SomeContext.dll 中发生了System.NullReferenceException 类型的异常,但未在用户代码中处理
【问题讨论】:
标签:
unit-testing
controller
asp.net-mvc-5
repository-pattern
bootstrapping
【解决方案1】:
您的存储库是否已初始化?
在您的控制器中:
private Repository Repository {get;set;}
public ActionResult Index()
{
Repository = new Repository();
var something = Repository.DoSomeWork();
return View(something);
}
在你的测试课中:
public void SomeTest()
{
var controller = new SomeController();
var result = controller.Index();
Assert.IsNotNull(result);
}
或者如果你使用依赖注入,你可以尝试使用 Ninject 属性注入来注入类:
public class SomeController : Controller
{
private IRepository repository;
[Inject]
public IRepository Repository
{
get { return repository; }
set { repository = value; }
}
// GET: /Some/
public ActionResult Index()
{
var someCollection = Repository.SomeMethod("some parameter");
foreach (var value in someCollection)
{
ViewData["message"] += value;
}
return View(someCollection);
}
}
和最小起订量的测试类:
public class SomeTestClass
{
private Mock<IRepository> mockRepository;
[Test]
public void GivenSometestThenExpectSomeResult()
{
// Arrange
var controller = new SomeController();
mockRepository = new Mock<IRepository>();
mockRepository.Setup(x => x.SomeMethod(It.IsAny<string>())).Returns(new List<string>());
controller.Repository = mockRepository.Object;
// Act
ActionResult result = controller.Index();
// Assert
Assert.AreEqual("Index", result.ViewName);
}
}