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 属性没有意义。这有点基于意见。我倾向于认为,如果您遵循基于测试的优先方法,您不一定知道属性将使用自动属性而不是支持字段来实现。因此,能够设置 属性 并再次检索它的行为是我通常会测试的。
我有以下代码要进行单元测试。
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 属性没有意义。这有点基于意见。我倾向于认为,如果您遵循基于测试的优先方法,您不一定知道属性将使用自动属性而不是支持字段来实现。因此,能够设置 属性 并再次检索它的行为是我通常会测试的。