This SO question 在没有显示"如何"的情况下解决了" can"。我坚持让它运行起来。任何人都可以提供一个例子吗?我试过了
public abstract class MyClass
{
public abstract Counter Counter { get; }
public int abstract Foo(int n);
public virtual int Foo(string s)
{
return Foo(Counter.Count(s));
}
}
我想模拟Foo(字符串s),这取决于抽象属性Counter。我想模拟Foo(字符串s)的原因是因为我不想为Counter和Foo(int n)提供定义,因为验证码只使用了Foo(字符串s)。
方法1:
var sub = Substitute.For<MyClass>();
ShimMyClass.AllInstances.Func1Int32 = ... ; // alternate behavior for testing
VerifyLogic(sub);
方法2:
var sub = Substitute.For<MyClass>();
var shim = new ShimMyClass(sub)
{
Func1Int32 = ... ; // alternate behavior for testing
};
VerifyLogic(shim.Instance);
两个都没有工作,调用原始类代码而不是shim代码。感谢。
答案 0 :(得分:1)
假设包含要测试的类的库是Lib。
namespace Lib
{
public interface Counter { int Count(string s); }
public abstract class AbstractClass : AbstractParent
{
internal int Value { get; set; }
public abstract int Foo(int x);
public int Foo(string s) { return Foo(Counter.Count(s)); }
}
public abstract class AbstractParent
{
internal abstract Counter Counter { get; }
}
}
在Test项目的References中找到Lib。选择&#34;添加假装配&#34;。
[TestMethod]
public void AbstractMethod()
{
var instance = Substitute.For<AbstractClass>();
using (ShimsContext.Create())
{
var instance = Substitute.For<AbstractClass>();
Lib.Fakes.ShimAbstractClass.AllInstances.FooString =
(_, s) => 1999;
Assert.AreEqual(1999, instance.Foo("hello"));
}
}