如何在 JustMock 中为 属性 setter 安排和断言 MustBeCalled

How to arrange and assert MustBeCalled for property setter in JustMock

我有一个带有 get 和 set 的 属性 的模拟 class。我的测试代码调用 setter 来分配连接字符串值。我的测试代码模拟了包含 属性 的 class,我在安排模拟时添加了 MustBeCalled。

视图模型代码:

public class ClientViewModel
{
    private readonly IMgmtDataProvider dataProvider;

    public ClientViewModel(IMgmtDataProvider dataProvider)
    {
        this.dataProvider = dataProvider;            
    }
    private string clientConnectionString;
    public string ClientConnectionString
    {
        get { return clientConnectionString; }

        set
        {
            clientConnectionString = value;
            if (dataProvider != null)
                dataProvider.ClientConnectionString = value;
        }
    }
}

测试代码:

//Arrange
const string connectionString = "THIS IS MY CONNECTIONSTRING";
var mockedDataProvider = Mock.Create<IMgmtDataProvider>();
Mock.Arrange(() => mockedDataProvider.ClientConnectionString).MustBeCalled();

//Act
var testViewModel = new ClientViewModel(mockedDataProvider);
testViewModel.ClientConnectionString = connectionString;

//Assert
var callCount = Mock.GetTimesCalled(() => mockedDataProvider.ClientConnectinString);
Assert.IsTrue(callCount > 0);

我的 Mock.Arrange(...).MustBeCalled();似乎应用于 getter,而不是 setter。因此,当我调用 Mock.GetTimesCalled(...) 时,它 returns 0。我需要将 MustBeCalled 应用于 setter 而不是 getter。我想确保在设置视图模型的连接字符串时设置数据提供者的连接字符串。我如何告诉 JustMock 跟踪模拟的 setter 被调用了多少次?

Setter 使用 Mock.ArrangeSet() 方法排列,如下所示:

Mock.ArrangeSet(() => mockedDataProvider.ClientConnectionString = Arg.AnyString).MustBeCalled();
....
Mock.Assert(mockedDataProvider); // assert all expectations on this mock

您还可以使用 Mock.AssertSet() 作为 ArrangeSet().MustBeCalled() 组合的替代方法。

最后,还有 Mock.GetTimesSetCalled() 方法,用于获取 setter 被调用的次数。

查看 documentation on property mocking 示例。