我想测试参数化抽象工厂方法实现:
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
{
}
答案 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
}