Unit testing 如何使用Moq模拟内部类保护的方法?

Unit testing 如何使用Moq模拟内部类保护的方法?,unit-testing,moq,Unit Testing,Moq,我的课程如下: public class TestService { public void Upload() { var manager = new Manager(); var worker = manager.CreateWorker(); worker.DoWork(); } } public class Manager { public Worker CreateWork() {

我的课程如下:

public class TestService
{
     public void Upload()
     {
        var manager = new Manager();
        var worker = manager.CreateWorker();
        worker.DoWork();
     }
}

public class Manager
{
    public Worker CreateWork()
    {
        return new Worker();
    }
}

public class Worker()
{
     public void DoWork()
     {
        SetupEnvironment();
        //some codes here...
     }

     protected virtual void SetupEnvironment()
     {
       //some codes here ...
     }
}
我想使用Moq为TestService类中的Upload()方法创建一个单元测试,Worker的SetupEnvironment()方法应该是模拟的。我尝试了下面的代码,但它不起作用:

[TestMethod]
public void Upload_Test()
{
        var mockWorker = new Mock<Worker>();
        mockWorker .Protected().Setup<string>("SetupEnvironment").Returns(() =>
        {
            //some dummy code here ...
        });

        var service = new TestService();
        service.Upload();
        Assert.IsTrue(true);
  } 
[TestMethod]
公共测试
{
var mockWorker=new Mock();
mockWorker.Protected().Setup(“SetupEnvironment”)。返回(()=>
{
//这里有一些伪代码。。。
});
var service=newtestservice();
service.Upload();
Assert.IsTrue(真);
} 

有人知道如何使上述单元测试代码工作吗?

有些事情需要更改。请参见下面的类
TestService
Worker
的代码

public class TestService
{
    private readonly Manager _manager;

    public TestService(Manager manager)
    {
        _manager = manager;
    }

    public void Upload()
    {
        var worker = _manager.CreateWorker();
        worker.DoWork();
    }
}

public class Manager
{
    public virtual Worker CreateWorker()
    {
        return new Worker();
    }
}

public class Worker
{
    public void DoWork()
    {
        SetupEnvironment();
        //some codes here...
    }

    protected virtual void SetupEnvironment()
    {
        //some codes here ...
    }
}
然后测试可能会像这样。方法
SetupEnvironment
void
,因此安装程序无法返回任何值,您还需要模拟
管理器
,并将其传递给
测试服务
,例如,通过构造函数注入,以便可以注入模拟对象。嗯

[TestMethod]
public void Upload_Test()
{
    bool setupEnvironmentWasCalled = false;

    Mock<Worker> mockWorker = new Mock<Worker>();
    mockWorker.Protected().Setup("SetupEnvironment")
        .Callback(() =>
        {
            //some dummy code here ...
            setupEnvironmentWasCalled = true;
        });

    Mock<Manager> mockManager = new Mock<Manager>();
    mockManager.Setup(m => m.CreateWorker())
        .Returns(mockWorker.Object);

    var service = new TestService(mockManager.Object);
    service.Upload();
    Assert.IsTrue(setupEnvironmentWasCalled);
} 
[TestMethod]
公共测试
{
bool setupenvironmentwascall=false;
Mock mockWorker=new Mock();
mockWorker.Protected().Setup(“SetupEnvironment”)
.Callback(()=>
{
//这里有一些伪代码。。。
setupEnvironmentWasCalled=true;
});
Mock mockManager=new Mock();
mockManager.Setup(m=>m.CreateWorker())
.Returns(mockWorker.Object);
var service=newtestservice(mockManager.Object);
service.Upload();
IsTrue(setupEnvironmentWasCalled);
} 

您的模拟对象还可以,但您的测试方法使用的是真实对象而不是假对象。这就是问题所在。。。。