如何模拟类成员,或强制构造函数返回模拟?



我目前正在使用Moq,但可以使用另一个框架,如果它更容易。

我想测试一个像这样的类:

using System.Threading;
public class Foo
{
[SerializeField]
private Thread thread = new Thread(new ThreadStart(ThreadProc));
public static void ThreadProc()
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(0);
}
}
public Foo()
{
}
public virtual void Interrupt()
{
if (thread.IsAlive)
{
thread.Interrupt();
}
}
}

现在我想测试一下interrupt方法。为了做到这一点,我想模拟线程成员,以验证是否根据IsAlive值命中了interrupt方法。

我怎么能嘲笑它呢?

PS:这不是我的真实代码,这只是一个例子,因为我不能张贴我的真实代码。然而,我遇到的问题是相同的,我需要有一个类构造函数在调用时返回一个对象。

解决这个问题的一种公认的丑陋方法是将thread的保护级别从private更改为protected,然后让测试类继承被测试类。根据您提供的示例代码,它看起来像这样:

public class Foo
{
[SerializeField]
protected Thread thread = new Thread(new ThreadStart(ThreadProc));
...
}
public class FooUnitTests: Foo {
private readonly Mock<Thread> threadMock = new Mock<Thread>();
[TestMethod]
public void Interrupt_ThreadIsAlive_CallsThreadInterrupt() {
threadMock.SetUp(m => m.IsAlive).Returns(true);
threadMock.SetUp(m => m.Interrupt()).Verifiable();
Interrupt();
threadMock.VerifyAll();
}
public FooUnitTests {
thread = threadMock.Object;
}
}

最新更新