2010-06-25 73 views
2

我想测试我的控制器中的_eventManager上的“Create”方法被调用。当我运行我的测试,我得到以下异常:Moq异常:验证需要参数的方法调用

试验方法Baigent.TheDoNation.Application.Tests.EventControllerTest.Create_Post_IfModelIsValidRedirectToSuccessfullyCreatedViewOccurs抛出异常信息:System.ArgumentException:无效设置一个非重写的成员上: M =>米.CreateEvent(It.IsAny(),It.IsAny())。

用于控制器的代码是:

public ActionResult Create(Event eventObject, FormCollection collection) 
    { 
     if (ModelState.IsValid) 
     { 
      _eventManager.CreateEvent(eventObject, User.Identity.Name); 

      return RedirectToAction("SuccessfullyCreated", new { }); 
     } 

     // Invalid - redisplay form with errors 
     return View(GetEventViewModel(eventObject)); 
    } 

的_eventManager字段被在构造方法设置。我的测试是:

 var eventManagerMock = new Mock<EventManager>(new FakeEventsRepository()); 
     eventManagerMock.Setup(m => m.CreateEvent(It.IsAny<Event>(), It.IsAny<String>())).Verifiable("No call to CreateEvent on the EventManager was made"); 

     var eventController = new EventController(eventManagerMock.Object); 

     var newEvent = new Event {Name = "Test Event", Date = DateTime.Now, Description = "Test description"}; 

     // Act 
     var result = eventController.Create(newEvent, new FormCollection()) as RedirectToRouteResult; 

     // Assert 
     eventManagerMock.Verify(m => m.CreateEvent(It.IsAny<Event>(), It.IsAny<String>())); 

     Assert.IsNotNull(result, "RedirectToRouteResult should be returned"); 
     Assert.AreEqual("SuccessfullyCreated", result.RouteValues["action"], "Redirect should be to SuccessfullyCreated view"); 

请帮忙!

回答

0

Moq只能嘲笑你的EventManager类型的虚拟成员。您应该考虑提取一个IEventManager接口,或使CreateEvent方法变为虚拟。

+0

谢谢你,你是对的。在发布后10分钟,我实际上得出了这个结论 - 这是一个急于尝试的帖子。 – user376085 2010-06-30 11:31:47

0

你将不得不使该方法虚拟,或者您需要定义一个具有方法CreateEvent()的接口,然后嘲笑接口:]

你现在想嘲笑中起订量有一个方法没有直接的权利来覆盖它。

1

这个例外告诉你,你试图覆盖非虚拟成员,这是不可能的。 Moq(以及Rhino Mocks和NMock)只能覆盖虚拟成员(包括纯粹的接口成员)。

参见here for a more detailed explanation

相关问题