Moq代理单元测试

问题描述:

我是使用Moq的新手,我找不到这样做的方法。 我有一个generateId私有方法,称为Moq代理单元测试

/// <summary> 
/// Generates a call Id for external interfaces 
/// </summary> 
/// <returns></returns> 
private string GenerateCallId() 
{ 
return "EX" + SharedServicesClientProxy.Instance.GenerateId().ToString(); 
} 

我想单元测试这种方法,因为这个原因,我需要模拟代理。 SharedServicesClientProxy只是一个实现接口ISharedServices但添加单例的对象。我想测试所有的字符串是否正确地返回了一个以“EX”开头的字符串。这是我的单元测试,使用Moq

/// <summary> 
    /// A test for GenerateCallId 
    /// A CallId for external systems should always start by "EX" 
    ///</summary> 
    [TestMethod()] 
    [DeploymentItem("myDll.dll")] 
    public void GenerateCallIdTest() 
    { 
     myService_Accessor target = new myService_Accessor(); 
     var SharedServicesClientProxy = new Mock<ISharedServices>(); 
     SharedServicesClientProxy.Setup(x => x.GenerateId()).Returns(5396760556432785286); 
     string actual; 
     string extCallIdPrefix = "EX"; 
     actual = target.GenerateCallId(); 
     Assert.IsTrue(actual.StartsWith(extCallIdPrefix)); 
    } 

我想我在错误的地方做我的模拟?

以更一般的方式,我如何模拟一个将被我测试的方法调用的对象? 为如:

 /// <summary> 
     /// dummy test 
     ///</summary> 
     [TestMethod()] 
     [DeploymentItem("myDll.dll")] 
     public void Foo() 
     { 
      myService_Accessor target = new myService_Accessor(); 
      boolexpected = false; 
      actual = target.Foo(); 
      Assert.IsTrue(actual,expected); 
     } 

     /// <summary> 
     /// Foo 
     /// </summary> 
     /// <returns></returns> 
     private bool Foo() 
     { 
      return this.Bar(); 
     } 

我需要MOQ酒吧,但如果我需要做的呢? 谢谢, Seb

在继续之前搜索术语“依赖注入”。

您对SharedServicesClientProxy.Instance有依赖关系,这是一个Singleton。这会导致测试隔离问题,因为您会在测试中重复使用相同的实例,并容易出现状态剩余问题。

我会通过公共接口劝注入这样的依赖关系(和OT-你不应该测试私有方法......考验。在那里,它是我的系统.. :)

public class AnonClass 
{ 
    ISharedServices _sharedServices; 
    AnonClass(ISharedServices sharedServicesObj) 
    { 
    _sharedServices = sharedServicesObj; 
    } 
    public string GenerateCallId() 
    { 
    return "EX" + _sharedServices.GenerateId().ToString(); 
    } 
} 

重新接线当前的代码来创建目标类这样

var class = new AnonClass(SharedServicesClientProxy.Instance); 

在您的测试,通过在模拟对象,而不是由辛格尔顿

返回的对象