繁体   English   中英

进行WCF服务呼叫的单元测试方法?

[英]Unit Testing Methods that make WCF Service Call?

首先尝试进行任何实际的单元测试。 我有一个WPF客户端应用程序,该应用程序从WCF服务中的方法接收数据。 这些方法调用直接从客户端应用程序中的视图模型进行:

   public string LoadArticle()
    {
       MyServiceClient msc = new MyServiceClient();
       return Article = msc.GetArticle(_UserName);
    }

然后,我有一个测试项目,在其中新建一个ViewModel,然后调用我的方法:

    [TestMethod]
    public void LoadArticleTestValid()
    {
        var articleViewModel = new ArticleViewModel("Thomas");

        string userName = "Thomas";
        string expected = "Article 1";

        var actual = articleViewModel.LoadArticle(userName); 

        etc.           
    }

显然,此测试将失败,因为客户端应用程序无法访问该服务以调用LoadArticle 如何解决这种情况? 我应该使用依赖注入并将某种IMyService接口传递给构造函数,而不是在ViewModel中创建MyServiceClient还是以某种方式模拟服务?

这就是问题:

MyServiceClient msc = new MyServiceClient();

这在ArticleViewModelMyServiceClient之间创建了紧密的耦合。 为了仅对 ArticleViewModel进行单元测试需要对这种依赖关系进行ArticleViewModel 如果存在IMyServiceClient则可以将其提供给类:

public ArticleViewModel
{
    private IMyServiceClient ServiceClient { get; set; }

    public ArticleViewModel(IMyServiceClient serviceClient)
    {
        this.ServiceClient = serviceClient;
    }

    // etc.
}

然后,该类中的代码不会创建新的服务客户端,而只会使用该属性中的那个。

然后,在单元测试中,您将创建IMyServiceClient模拟,在该模拟上定义预期的行为,并将其提供给要测试的对象。 如何执行取决于模拟库。 Rhino Mocks中的一个简单示例如下所示:

// arrange
var serviceClient = MockRepository.GenerateMock<IMyServiceClient>();
serviceClient.Stub(c => c.GetArticle(Arg<string>.Is.Anything)).Return("Article 1");

var model = new ArticleViewModel(serviceClient);

// act
var result = model.LoadArticle("Thomas");

// assert
Assert.AreEqual("Article 1", result);

这里的想法是,单元测试仅测试LoadArticle方法,而不测试该方法调用的依赖项。 这些依赖性提供了预期的行为,并根据这些预期的行为检查了结果。

注意:没有什么可以阻止单元测试提供MyServiceClient实际实现,而不是提供模拟。 单元测试项目只需要配置该服务即可使用。 (单元测试项目是应用程序宿主,它们可以具有App.config文件。)这将是集成测试而不是单元测试,但是可以对结果进行相同的声明。

是的,我认为您是对的,我建议使用IMyService的构造函数参数,您可以使用该参数将模拟注入到对象中进行测试。

进一步! 我建议不要使用自动生成的服务客户端。 如果将代码复制并粘贴到自己的类中,则可以使其实现IMyService,并有效地隐藏它使用WCF,直接进入DB或是真实代码中的模拟对象的事实。

这将允许您将模拟注入WPF中以进行UI测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM