使用 Moq 自动模拟真实世界构造函数属性的任何方法



我有一个有很多构造函数注入的控制器:

public MoviesController(ISession session, IClientContext clientContext, PManager pManager, ISegmentationService segmentationService, IGeoLocator geoLocator, IBus bus)
{
    _session = session;
    _clientContext = clientContext;
    _pManager = pManager;
    _segmentationService = segmentationService;
    _geoLocator = geoLocator;
    _bus = bus;
}

根据我的理解(只是阅读有关 Mocking 的信息),如果我希望基于此控制器制作一个全面的测试套件,我有很多 Mock 对象属性需要手动设置。

对于一种方法,我只使用一种服务(如果可能的话,我什至想毫不费力地自动化它):

public object Show(Guid id)
{
    var movie = _session.Get<movie>(id);
    return movie;
}

但是在另一个中使用了许多服务 - 有没有办法快速设置这些 Moq 对象?我真的可以使用一些示例,因为我是测试新手。这是一个 asp.net mvc 项目,捆绑了 webapi 1(在此处测试 webapi 控制器)

正如注释中所说,如果您有通用的设置代码,则可以将其放入每次测试之前从测试框架自动调用的 Setup 方法中。 如果您使用的是 Nunit TestInitialize如果您使用的是 MStest,则它使用 Setup 属性进行装饰。 如果你使用的是XUnit,那么它就有点不同了。

因此,您的类可能如下所示:

public class SomeTests {
    Mock<ISession> _sessionMock;
    Mock<IClientContext> _clientContextMock;
    [Setup]
    public void Setup() {
        _sessionMock = new Mock<ISession>();
        _clientContextMock = new Mock <IClientContext();
    }
    MovieController CreateSut() {
        return new MovieController(_sessionMock.Object, _clientContextMock.Object, ...);
    }
    [Test]
    public void TestSomething() {
        _sessionMock.Setup(x=>...);
        //...
        var sut = CreateSut();
       //...
    }
}  

如果你想摆脱完全手动创建模拟,那么你可能需要看看像AutoFixture这样的东西 自动起订量. 这将在创建接受接口的对象时自动提供模拟实例。 AutoFixture可能非常有用,但是有效使用它有一个学习曲线,因此您可能需要查看教程/快速入门。

您还可以配置 IOC 容器来为您的测试项目提供模拟实例,尽管我自己从未走过这条路。

对于您的示例,您只需要模拟会话,并且可以将所有其他依赖项保留为空,因为它们的行为应该与您正在测试的行为无关:

Mock<ISession> mockSession = new Mock<ISesssion>();
MoviesController controller = new MoviesController(mockSession.Object, null,null,null,null,null);
除了

此特定测试所需的模拟之外,您无需设置任何模拟

相关内容

  • 没有找到相关文章

最新更新