Moq异常:验证需要参数的方法调用
问题描述:
我想测试我的控制器中的_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");
请帮忙!
答
Moq只能嘲笑你的EventManager
类型的虚拟成员。您应该考虑提取一个IEventManager
接口,或使CreateEvent
方法变为虚拟。
答
你将不得不使该方法虚拟,或者您需要定义一个具有方法CreateEvent()的接口,然后嘲笑接口:]
你现在想嘲笑中起订量有一个方法没有直接的权利来覆盖它。
答
这个例外告诉你,你试图覆盖非虚拟成员,这是不可能的。 Moq(以及Rhino Mocks和NMock)只能覆盖虚拟成员(包括纯粹的接口成员)。
谢谢你,你是对的。在发布后10分钟,我实际上得出了这个结论 - 这是一个急于尝试的帖子。 – user376085 2010-06-30 11:31:47