2016-11-21 123 views
0

我必须单元测试C#项目,它依赖于其他几个Web服务。虽然单元测试我不想调用服务,但只是返回一个虚拟值。我正在尝试使用垫片,但我面临的问题。当前代码创建针对外部web服务的客户端,然后调用一个方法单元测试一个c#.Net网络服务通过隔离它依赖的网络服务

CSSFormTransformationClient client = new CSSFormTransformationClient(); 
MemoryStream stream = client.TransformToPDF(cssRequest); 

由svcutil.exe的工具生成的CSSFormTransformationClient的定义和有一个方法TransformToPDF如下

public System.IO.MemoryStream TransformToPDF(Mycompany.Enterprise.Reporting.ServiceReferences.CssTransformation.TransformRequest transformRequest) 
{ 
    return base.Channel.TransformToPDF(transformRequest); 
} 

现在我假设我可以用以下方式使用匀场来模拟transformToPDF的返回值

ServiceReferences.CssTransformation.Fakes.ShimCSSFormTransformationClient.AllInstances.TransformToPDF =() => { } 

但是它不允许我。有人告诉我如何模拟transformToPDF方法?

感谢。

P.S - 该项目使用WCF。

+0

我已经添加了假装配和一切..只是错过了正确的方式去做这个.. –

+0

你可以定义“不让我”?你是否收到错误或其他消息?究竟是什么问题?另外,你有没有尝试Moq? – Brandon

+0

@Brandon _ServiceReferences.CssTransformation.Fakes.ShimCSSFormTransformationClient.AllInstances_ 之后它只给了我两个选项“等于”和“引用等于”。如果我做了其他事情,VS强调它是红色的。我没有尝试过模拟。鉴于moq在这种服务隔离中的一般描述和一般适合性,是否会暗示垫片? –

回答

0

按照我的评论:用Moq试试(Available on NuGet)。

using Moq; 
using TransformRequest = Mycompany.Enterprise.Reporting.ServiceReferences.CssTransformation.TransformRequest; 

private MemoryStream _toReturn; 

public void SetupTest() 
{ 
    this._toReturn = new MemoryStream();  
} 
public void TearDownTest() 
{ 
    if (this._toReturn != null) 
    { 
     this._toReturn.Dispose(); 
    } 
} 

public void YourTestMethod() 
{ 
    var client = new Mock<CSSFormTransformationClient>(); 

    client.Setup(c => c.TransformToPDF(It.IsAny<TransformRequest>()) 
      .Returns(this._toReturn); 

    MemoryStream stream = client.TransformToPDF(cssRequest); //Get cssRequest beforehand... I don't know where it came from. 

    //Continue with your test. 
} 
+0

好!谢谢!我会试一试。 :) –