如何使用Moq模拟返回“this”的方法

8

我有一个接口

interface IService
{
    IService Configure();
    bool Run();
}

"真正的"实现是这样的:
class RealService : IService
{
    public IService Configure()
    {
        return this;
    }

    public bool Run()
    {
        return true;
    }
}

使用Moq来模拟服务会创建一个默认实现的Configure()方法,该方法返回null

是否有一种方法可以在Moq中设置方法,使其返回被模拟的实例?

3个回答

5
假设您正在使用Moq,可以通过简单的设置来模拟返回自身:

假设您正在使用Moq,您只需Setup模拟即可返回自身:

var mock = new Mock<IService>();

mock.Setup(service => service.Configure()).Returns(mock.Object);

var testClass = new TestClass(mock.Object);

然后验证方法返回了你期望的内容:

Assert.AreEqual(mock.Object, testClass.DoStuff());

你说的“Moq from Microsoft”是指这个Moq吗? - Jeppe Stig Nielsen
@JeppeStigNielsen 确实,我应该更准确。 - meJustAndrew

3

无论哪种方式,都可以设置返回模拟实例的方法。

//Arrange
var instance = Mock.Of<IService>();//mocked instance
var mockService = Mock.Get(instance);//mock object used to setup instance functionality
//setup method to return mocked instance
mockService.Setup(m => m.Configure()).Returns(instance);

或者

//Arrange
var mockService = new Mock<IService>();//mock object used to setup instance functionality
var instance = mockService.Object;//mocked instance
//setup method to return mocked instance
mockService.Setup(m => m.Configure()).Returns(instance);

2
你可以创建另一个使用相同接口的Mock对象并返回它:
[TestClass]
public class UnitTest1
{

    [TestMethod]
    public void TestMethod1()
    {
        var serviceMock1 = new Mock<IService>();
        var serviceMock2 = new Mock<IService>();

        serviceMock1.Setup(service => service.Configure())
            .Returns(serviceMock2.Object);

        var testClass = new TestClass(serviceMock1.Object);

        Assert.IsNotNull(testClass.DoStuff());
    }
}

public class TestClass
{
    private readonly IService _service;

    public TestClass(IService service)
    {
        _service = service;
    }

    public IService DoStuff()
    {
        return _service.Configure();
    }
}


public interface IService
{
    IService Configure();
    bool Run();
}

public class RealService : IService
{
    public IService Configure()
    {
        return this;
    }

    public bool Run()
    {
        return true;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接