3

Moq を使用すると、モックされたプロパティを設定して変更することはできますか?

たとえば、次のようになります。

public interface IService // To be mocked.
{
    bool IsConnected { get; }
}

次のように IService のモックをセットアップすることは可能ですか?

var mockService = new Mock<IService>();

// Setup mockService so IsConnected mutates...?

bool before = mockService.Object.IsConnected;

bool after = mockService.Object.IsConnected;

Assert.AreNotEqual(before, after);

確かに、この設定ではうまくいきません:

mockService.SetupGet(service => service.IsConnected).Returns(false);
mockService.SetupGet(service => service.IsConnected).Returns(true);

これは、Moq が記録/再生モデルを実装していないという私の理解と一致しています。

もう少し現実的な例を次に示します。

public interface IService // To be mocked.
{
    bool IsConnected { get; }

    void Connect(); // Mutates IsConnected.
}

class Client // To be tested
{
    private readonly IService service;

    public Client(IService service)
    {
        this.service = service;
    }

    public bool DoWork()
    {
        if (!service.IsConnected)  // In test, IsConnected should return false.
        {
            service.Connect();
        }

        if (!service.IsConnected) // In test, IsConnected should return true.
        {
            return false;
        }

        // ... yada yada yada more code

        return true;
    }
}

Moq 4.0.10827.0 を使用しています。

4

1 に答える 1

5

Returns をFunc<bool>ブール値ではなく a に設定できます。次に、その関数が結果を変更するように記述します。何かのようなもの....

bool isConnected = false
var mockService = new Mock<IService>();
// Setup mockService so IsConnected mutates...?
mockService.Setup(s => s.Connect()).Callback(() => isConnected = true);
mockService.SetupGet(s => s.IsConnected).Returns(() => isConnected);

bool before = mockService.Object.IsConnected;

mockService.Object.Connect();

bool after = mockService.Object.IsConnected;

Assert.AreNotEqual(before, after);

ただし、サービスがどれほど複雑になるかによっては、モックの代わりに FakeService を作成して使用することを検討することをお勧めします。

于 2012-06-07T12:42:28.003 に答える