[HttpPost]
public ActionResult Create(Car car)
{
_repository.CreateCar(car);
_repository.UpdateRegistrationDetails(car);
}
我想要做的是编写单元测试以确保Create
调用CreateCar
和UpdateRegistrationDetails
。关于这些方法中发生的事情并不重要,只是它们被调用。有人可以告诉我该怎么做?我需要使用模拟框架吗?我安装了RhinoMocks使用。你在RhinoMocks中使用Expect
吗?
答案 0 :(得分:4)
再次使用Moq我认为你需要模拟存储库(当然在这里假设名称)
var mock = new Mock<IRepository>();
var controller = new Controller(mock.Object); //assuming this is how you create it
var car = new Car();
controller.Create(car);
mock.Verify(x => x.CreateCar(car));
mock.Verify(x => x.UpdateRegistrationDetails(car));
无需Setup
或Expect
,因为模拟方法不会返回任何内容
[编辑] 这是一个Rhino.Mocks示例
var mock = MockRepository.GenerateStub<IRepository>();
var controller = new Controller(mock); //assuming this is how you create it
var car = new Car();
controller.Create(car);
mock.AssertWasCalled(x => x.CreateCar(car));
mock.AssertWasCalled(x => x.UpdateRegistrationDetails(car));
答案 1 :(得分:1)
最好的答案是使用模拟框架,就像其他人提到的那样。肮脏的方式,但有时更快,如果你不想学习模拟框架(你真的应该)是创建一个测试类并覆盖虚拟方法。在你的情况下像
public class RepoUnderTest : Repo
{
public bool UpdateRegistrationDetailsCalled = false;
public override void UpdateRegistrationDetails(Car car)
{
base.UpdateRegistrationDetails(car);
UpdateRegistrationDetailsCalled = true;
}
}
然后你可以测试类似于
的东西[HttpPost]
public ActionResult Create(Car car)
{
// Arrange
var _repository = new RepoUnderTest();
// Act
_repository.CreateCar(car);
// Assert
Assert.IsTrue(_repository.UpdateRegistrationDetailsCalled);
}
同样,模拟框架最好。我会投票支持这些,但有时候这是一个简单的介绍来测试这些东西,然后再加入嘲笑。
答案 2 :(得分:1)
关于在犀牛模拟中使用Expect()
。我更喜欢尽可能使用存根和'Stub()'或AssertWasCalled()
方法。 Expect()
用于没有其他功能的情况。