Asp.net mvc mvc抛出系统中的Moq.NullReferenceException

Asp.net mvc mvc抛出系统中的Moq.NullReferenceException,asp.net-mvc,nunit,moq,Asp.net Mvc,Nunit,Moq,我有一个客户控制员 //httpget public ActionResult Create() { return View(); } //httppost public ActionResult Create(Customer customer) { if (ModelState.IsValid) { db.Customers.Add(customer);

我有一个客户控制员

     //httpget
     public ActionResult Create()
    {
        return View();
    }

    //httppost
    public ActionResult Create(Customer customer)
    {
        if (ModelState.IsValid)
        {
            db.Customers.Add(customer);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(customer);
    }
我已经创建了一个单元测试

      [Test]
      public void Should_Return_To_Index_Page_After_Saving_A_Valid_Customer()
    {
        var mockContext = new Mock<DbContext>();
        var mockCustomer = new Mock<Customer>();
        var sut = new CustomerController(mockContext.Object);

        var result = sut.Create(mockCustomer.Object) as RedirectToRouteResult;
        Assert.That(result.RouteValues["action"], Is.EqualTo("Index"));
    }
但它总是向我抛出一个异常类型为“System.NullReferenceException”的异常发生在Create方法中的db.Customers.Addcustomer处。谁能解释一下我哪里做错了

我对MVC nunit测试有点陌生

您的模拟为Customers属性返回null

您可能需要这样做:

var mockCustomers = new Mock<IList<Customer>>(); // or whatever type it needs to be
mockContext.Setup(x => x.Customers).Returns(mockCustomers.Object);

在这种情况下,您不需要模拟Customer类和集合。在这种情况下,您应该模拟的唯一依赖项是DbContext

[Test]
public void Should_Return_To_Index_Page_After_Saving_A_Valid_Customer()
{
    var mockContext = new Mock<DbContext>();
    mockContext.Setup(x => x.Customers).Returns(new List<Customer>());

    var sut = new CustomerController(mockContext.Object);

    var result = sut.Create(new Customer()) as RedirectToRouteResult;
    Assert.That(result.RouteValues["action"], Is.EqualTo("Index"));
}

它抛出了一些错误,重载的方法有一些无效的参数