2011-09-16 68 views
0

我的应用程序有一个ProviderFactory静态类,它具有静态实用程序方法,可以将类似于记录器的事件的静态实例传回。我的应用程序的其余部分可以从任何地方抓取记录器的引用,而无需传入记录器(通用设计实践)。使用Moq在模拟对象上验证间接调用的方法

因此,我的应用程序的另一部分DbCacheProvider具有方法,可以在内部调用记录器,从而获得对工厂记录器的引用,然后向其发出调用。

我的问题是,使用Moq,我想验证记录器上的方法正在被DbCacheProvider中的方法调用。当我将一个模拟记录器作为参数传递给DbCacheProvider时,我可以使用依赖注入来做到这一点,但我没有将记录器传入(我不想)。那么,我将如何验证DbCacheProvider正在对记录器进行调用?

回答

0

如果您不想通过构造函数传入记录器,则需要在运行单元测试时更改ProviderFactory以返回模拟记录器。

反正有几个原因,它经常建议建立依赖注入:

  1. 你的测试更简单,不涉及定制工厂finagling
  2. IoC框架一样团结,Ninject和当Autofac以这种方式设置依赖关系时,可以轻松创建对象。如果以这种方式设置所有对象,框架将完成创建正确对象并将它们传递给您的所有重要工作。依赖注入是自动完成的,不会对您造成负担。
0

没有答案老问题,我也有类似的问题,解决它像这样:

我有下面的示例代码和需要验证,不仅是所谓的方法,但被称为具有特定值。

public interface ILog 
{ 
    void Info(string message); 
} 

public interface ILogFactory 
{ 
    ILog GetLogger(); 
} 

这是被测试的类,其中接口项目被注入:

public class NewAction 
{ 
    readonly ILogFactory _logger; 

    public NewAction(ILogFactory logger) 
    { 
     _logger = logger; 
    } 

    public void Step1() 
    { 
     _logger.GetLogger().Info("Step 1"); 
    } 

    public void Step2() 
    { 
     _logger.GetLogger().Info("Step 2"); 
    } 
} 

这显然是我的实际代码非常简单的观点,但我需要验证第一步和第二步行为如预期,并将正确的值传递给Log,这意味着我还需要确保它们以正确的顺序发生。我的测试:

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     // Arrange 
     var log = new Mock<ILog>(); 

     var factory = new Mock<ILogFactory>(); 
     factory.Setup(l => l.GetLogger()).Returns(log.Object); 

     // Act 
     var action = new NewAction(factory.Object); 
     action.Step1(); 
     action.Step2(); 

     // Assert 
     factory.Verify(l => l.GetLogger()); 
     log.Verify(l => l.Info(It.Is<string>(s => s == "Step 1"))); 
     log.Verify(l => l.Info(It.Is<string>(s => s == "Step 2"))); 
    } 
} 

希望这会有所帮助。

相关问题