在调用方法中模拟局部变量

yur*_*art 3 c# unit-testing class moq

在我班级的方法中嘲笑局部变量时遇到了一些麻烦.

我尝试模拟我的Worker类,但它调用一个返回null值的方法,我的上下文变量变为null.因此,当我尝试获取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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Fab*_*lai 5

这里可以说一些事情.

首先, - 但这只是我的意见 - 你应该避免部分模拟(部分模拟=模拟一个没有实现接口的抽象类,因此,保留未被模拟的方法的原始实现.).最好的方法是拥有一个可以实现的IWorker界面Worker.

第二 - 我会创造严格的嘲笑.松散的模拟看起来像一个很好的快捷方式,但通常会让你的方法和属性在你不打算时返回默认值(null在你的情况下)

第三 - 我会注射WorkerContext.如果你不能注入它,因为你需要使用来自.ctor参数进行参数化,然后注入一个WorkerContextFactory允许你模拟你的创建和参数化的WorkerContext