2013 年 Visual Studio 中使用垫片的单元测试接口和抽象成员

Unit Testing Interface and abstract memebers using shims in Visual Studio 2013

我有以下代码要进行单元测试。

public abstract class Manager : MyPermissions, IManager
{   
    public IManager empManager { get; set; }

    public void UpdatePermission()
    {
       if (empManager != null)
           empManager.UpdatePermissions();
    }
}

我在同一个库中没有从上面的 class 派生的 class 否则我宁愿测试派生的 class 来测试上面的代码。现在我有下面的测试,我是 运行 但它实际上并没有达到实际的测试代码。

[TestMethod]
public void empManagerGetSet()
{
    using (ShimsContext.Create())
    {
        StubIManager sManager;
        sManager = new StubIManager();
        sManager.empManagerGet = () => { return (IManager)null; };
        var result = sManager.empManagerGet;
        Assert.IsNotNull(result);
    }
}

在这种情况下,我可以使用任何其他方法来编写更好的 UT 吗?

你没有说你的 MyPermissions class 长什么样,如果它有一个构造函数,如果有的话它做了什么..所以这可能不是正确的方法。请注意,您还需要为 Manager class.

中定义的任何抽象方法实现存根

如果您只想测试 empManager 属性,您可以在测试项目中创建一个可测试的派生类型并测试其属性。这会给你这样的东西:

class TestableManager : Manager {
}

然后进行如下测试:

[TestMethod]
public void TestManagerPropertyRoundTrip {
    var sut = new TestableManager();
    Assert.IsNull(sut.empManager);
    sut.empManager = sut;
    Assert.AreEqual(sut, sut.empManager);
}

您还可以通过 TestableManager 在 Manager class 上测试任何其他方法,因为它的存在只是为了使 class 具体化。

您的问题的评论中建议测试 public 属性没有意义。这有点基于意见。我倾向于认为,如果您遵循基于测试的优先方法,您不一定知道属性将使用自动属性而不是支持字段来实现。因此,能够设置 属性 并再次检索它的行为是我通常会测试的。