如何动态地子类化(或实现)基类(或接口)?

时间:2015-09-03 01:17:33

标签: c# unit-testing

我想测试参数化抽象工厂方法实现:

public class AbstractChairFactory
{
  public static ChairFactory GetFactory(IChairType type)
  {
    if(type is ChairA)
       ...
    if(type is ChairB)
      ...
    throw new Exception("Unknow type");
  }
}

interface IChairType {}
class ChairA : IChairType
{
}

class ChairB : IChairType
{
}

AbstractChairFactory.GetFactory方法应该在任何类型的实例而不是类型IChairType的实例传递给它时抛出异常。

一种方法是设计另一个类FakeType

class FakeType : IChairType {}

并传递给他们。

但有没有更好的方法呢?我的意思是一种动态实现IChairType的方法。像这样:

   IChairType fakeInstance = SomeMagic.GetAFakeVersionOf<IChairType>();

   try
   {
        AbstractChairFactory.GetFactory(fakeInstance);
        Assert.Fail();
   }
   catch
   {

   }

1 个答案:

答案 0 :(得分:1)

你在寻找的是Mocking。存在像Moq这样的免费框架。某些版本的Visual Studio也包含Microsoft Fakes。还有像TypeMock这样的商业产品可以做到这一点。

要在Moq中执行类似的操作,您的测试可能如下所示(假设IChairType有一个返回字符串的方法A):

[TestMethod]
public void TestMethod1()
{
    var i = new Moq.Mock<IChairType>();
    i.Setup(x => x.A()).Returns("A Faked String");

    var fakedObject = i.Object;
    var result = fakedObject.A();

    Console.WriteLine(result);  // A Faked String
}
相关问题