首页 > 解决方案 > 对象的最小起订量设置属性

问题描述

我不得不使用一个具有未知依赖项并且可能有其他代码气味的类。

我无法更改此类及其在我不想接触的大量其他项目中的使用。

我创建了一个工厂来创建这个对象并设置属性。

我想要对这个工厂进行单元测试,并且由于这个对象未知的依赖关系,我正在使用 MOQ 创建一个模拟。

我有一个问题,我无法在 MOQ 对象上设置属性。我希望它由工厂设置而不是使用

    mock.Setup(x => x.FirstName).Returns(firstName);

所以这是我的演示代码和测试

    [TestCase("John")]
    [TestCase("Paul")]
    [TestCase("George")]
    [TestCase("Ringo")]
    public void Create(string firstName)
    {
        //arrange
        var mock = new Mock<IPerson>();

        //act
        var actual = PersonFactory.Create(mock.Object, firstName);
        //assert
        Assert.AreEqual(firstName, actual.FirstName);
    }

工厂是这样的

public static class PersonFactory
{
    public static IPerson Create(IPerson person, string firstName)
    {
        person.FirstName = firstName;
        return person;
    }
}

我已经用 NSubsitute 尝试过这个并且让它工作正常。我怀疑它在某个地方需要一个 .object 。

标签: c#unit-testingmoq

解决方案


允许 mock 记录 callin 分配给属性的值

mock.SetupAllProperties(); //Stub all properties on a mock (not available on Silverlight):

参考MOQ 快速入门:属性

[TestCase("John")]
[TestCase("Paul")]
[TestCase("George")]
[TestCase("Ringo")]
public void Create(string firstName) {
    //arrange
    var mock = new Mock<IPerson>();
    mock.SetupAllProperties();

    //act
    var actual = PersonFactory.Create(mock.Object, firstName);

    //assert
    Assert.AreEqual(firstName, actual.FirstName);
}

您也可以直接验证属性集

mock.VerifySet(foo => foo.FirstName = firstName);

例如

[TestCase("John")]
[TestCase("Paul")]
[TestCase("George")]
[TestCase("Ringo")]
public void Create(string firstName) {
    //arrange
    var mock = new Mock<IPerson>();

    //act
    var actual = PersonFactory.Create(mock.Object, firstName);

    //assert
    mock.VerifySet(_ => _.FirstName = firstName);   
}

推荐阅读