单元测试确保一个方法调用另一个方法

时间:2011-07-10 22:35:17

标签: asp.net-mvc unit-testing model-view-controller mocking rhino-mocks

[HttpPost]
public ActionResult Create(Car car)
{
   _repository.CreateCar(car);
   _repository.UpdateRegistrationDetails(car);
}

我想要做的是编写单元测试以确保Create调用CreateCarUpdateRegistrationDetails。关于这些方法中发生的事情并不重要,只是它们被调用。有人可以告诉我该怎么做?我需要使用模拟框架吗?我安装了RhinoMocks使用。你在RhinoMocks中使用Expect吗?

3 个答案:

答案 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));

无需SetupExpect,因为模拟方法不会返回任何内容

[编辑] 这是一个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()用于没有其他功能的情况。