【发布时间】:2015-10-09 09:00:33
【问题描述】:
我在类的方法中模拟局部变量时遇到了一些麻烦。
我尝试模拟我的 Worker 类,但它调用了一个返回空值的方法,并且我的上下文变量变为空。因此,当我尝试获取 Name 属性时出现异常。
如何强制CreateWorkerContext() 返回模拟值?可能有办法模拟局部变量 (context)?
谢谢!
我的代码会更详细地说明问题:
namespace Moq
{
class Program
{
static void Main(string[] args)
{
var workerMock = new Mock<Worker>();
workerMock.Object.GetContextName();
}
}
public class Worker
{
public string GetContextName()
{
// something happens and context does not create (imitated situation)
WorkerContext context = CreateWorkerContext();
// exception because _context is null
return context.Name;
}
private WorkerContext CreateWorkerContext()
{
// imitate that context is not created
return null;
}
}
public class WorkerContext
{
public string Name { get; set; }
}
}
【问题讨论】:
-
您需要完全提取或更改
WorkerContext CreateWorkerContext()。也许将IWorkerContextFactory注入Worker的构造函数。 -
1 代表工厂。或者使
IWorkerContex可注射。 -
不幸的是,你不能模拟任何东西,它必须是一个接口或一个带有虚拟方法的类。
-
好吧,这并不难过,只是您当前的架构不容易测试,因为它不太遵守 SOLID 原则 (en.wikipedia.org/wiki/SOLID_(object-oriented_design))
-
需要注入对象才能得到正确的结果。但是,您正在嘲笑部分并期望部分返回正确的结果。真的是你想写的吗?如果您想使用这个模拟类来测试其他东西,您不能锁定 GetContextName() 以返回 Dummy 字符串然后使用它吗?
标签: c# class unit-testing moq