【发布时间】:2016-06-29 19:54:11
【问题描述】:
我截断了以下代码,并尝试使用 typemock 对其进行测试,但得到了 InvalidCast 异常。 ISomeClass 只是一个接口,而 SomeClass 实现了该接口。 UseOfSomeClass 是另一个使用 SomeClass 的类,它的构造函数以 SomeClass 作为参数。我需要测试 UseOfSomeClass。如何将 typemock 假对象注入到类构造函数中?
public interface ISomeClass
{
void DoSomething();
}
public class SomeClass : ISomeClass
{
public void DoSomething()
{
Console.WriteLine("Do something!");
}
}
public class UseOfSomeClass
{
public SomeClass SomeClassProperty { get; set; }
public bool IsChecked { get; set; }
public UseOfSomeClass(SomeClass someClass)
{
SomeClassProperty = someClass;
}
public void MyMethod()
{
SomeClassProperty.DoSomething();
IsChecked = true;
}
}
然后测试:
[TestClass]
public class UseOfSomeClassTest
{
[TestMethod]
public void TestMethod1()
{
var fakeSomeClass = Isolate.Fake.Instance<ISomeClass>();
var use = new UseOfSomeClass((SomeClass)fakeSomeClass);
use.MyMethod();
Assert.IsTrue(use.IsChecked);
}
}
谢谢!
【问题讨论】:
-
你不应该嘲笑
SomeClass而不是ISomeClass吗? -
是的。如果我模拟 SomeClass,它可以正常工作。但为什么我不应该嘲笑 ISomeClass?或者什么时候应该模拟一个接口,什么时候模拟一个具体的类?
-
如果类构造函数需要
SomeClass,则需要模拟SomeClass。如果它需要ISomeClass,则需要模拟ISomeClass。通常,当您进行依赖注入时,您应该更愿意将UseOfSomeClass更改为在构造函数中接受ISomeClass而不是SomeClass。实际上,你不应该将接口命名为类似于类,它应该代表类实现的契约。 -
这是有道理的。谢谢
-
Yacoub 是对的,你应该模拟 SomeClass 因为它是你的 c'tor 需要的对象,你将模拟它作为未来的实例,如下所示:var fakeSomeClass = Isolate.Fake .NextInstance
();
标签: dependency-injection typemock