使用Moq或任何其他模拟工厂从模拟存储库中检索模拟

时间:2014-09-05 05:04:23

标签: c# mocking ninject moq

如何使用moq从模拟存储库中检索模拟对象?

我有一个应用程序(mvc2),它不是第一次真正设计用于支持测试单元,但我正在尝试调整它。 我有一个服务定位器,可以创建所需的类型。

基本上我想要使用模拟框架做的是用模拟对象替换表示方法中服务的变量,然后我想检索那些模拟对象并进行设置。

所以:

private ApprovalLevel GetApprovalLevel(Fusion Fusion)
{
    var ScopeofService=ServiceLocator.GetInstance<IScopeofService>();
    var programs=ScopeofService.GetPrograms();
    ...    
} 

在我的测试单元中,我将ServiceLocator设置为使用模拟内核来模拟我的 IScopeofService ,这样可以正常工作。模拟内核使用作为param发送的模拟存储库 MockRepository Moq,它将为所需的接口绑定并创建所需的模拟。

现在我想在我的测试中检索那个模拟器,为GetPrograms()设置一个假值,但是MockRepository没有get mock只是创建新模拟的方法。

他仍然以某种方式保留对模拟的所有引用,因为它具有VerifyAll方法。

更新

public MockNinjectControllerFactory(Moq.MockRepository mockRepository)
{
    Kernel = new StandardKernel(new MockNinjectServices(mockRepository));
}

public class MockNinjectServices : NinjectModule
{
    private readonly MockRepository _mockRepository;
    public MockNinjectServices(MockRepository _mockRepository)
    {
        this._mockRepository = _mockRepository;
    }

    // TODO MARIAN: Resolver should return actualy mock objects also to be able to set them.
    public void BindToConstant<T>() where T : class
    {
        Bind<T>().ToConstant(_mockRepository.Create<T>().Object).InSingletonScope();
    }

    public void BindMock<T>() where T : class
    {
        Bind<Mock<T>>().To(typeof(Mock<T>)).InSingletonScope();
    }

    public override void Load()
    {
        BindToConstant<IPaymentInvoiceRep>();
        BindToConstant<IPaymentInvoiceBL>();
    }
}

测试本身:

[TestFixture]
public class DemoControllerFixture
{
    readonly MockRepository _mockRepository = new MockRepository(MockBehavior.Default);

    [Test]
    public void Should_MyMethod()
    {           
        EvedServiceLocator.Default = new MockNinjectControllerFactory(_mockRepository);
        var sut=new DemoController();

        // now if my sut has something that will resolve as mock created by my mockRepository I would like to retrieve that mock and set up something on it.            
    }
}

1 个答案:

答案 0 :(得分:0)

使用Moq.Get()从具体引用中获取模拟对象。在代码中:

[Test]
public void Should_MyMethod()
{           
    EventServiceLocator.Default = new MockNinjectControllerFactory(_mockRepository);
    var sut=new DemoController();

    var scopeService EventServiceLocator.Default.GetInstance<IScopeofService>();
    var mockScopeService = Mock.Get(scopeService);
    mockScopeService.Setup(p => p.GetPrograms()).Returns(/* TODO */); 
}