单元测试参数发送到WCF服务

时间:2011-11-03 14:37:17

标签: .net wcf unit-testing

创建单元测试以测试我发送给WCF服务的参数的最佳方法是什么?

我有一个项目,我有一个与我的WCF服务对话的存储库类。它看起来像这样:

public class MyRepository : IMyRepository
{
    public Customer GetCustomer(int customerId)
    {
        var client = new MyWCFServiceClient();
        MyWCFServiceCustomer customerWCF = client.GetCustomer(customerId);
        Customer customer = ConvertCustomer(customerWCF);
        return customer;
    }

    //Convert a customer object recieved from the WCF service to a customer of
    //the type used in this project.
    private Customer ConvertCustomer(MyWCFServiceCustomer customerWCF)
    {
        Customer customer = new Customer();
        customer.Id = customerWCF.Id;
        customer.Name = customerWCF.Name;
        return customer;
    }
}

(这显然是简化的)

现在我想编写单元测试来检查我从存储库发送到我的服务的参数是否正确。在上面的示例中,由于我只是在传入时发送customerId,所以它会有点无意义,但在我的实际代码中,存储库类中有更多参数和更多逻辑。

问题是生成的服务客户端类(MyWCFServiceClient)没有接口,所以我不能在我的测试中模拟它(或者我错了吗?)。 < / p>

编辑:我错了。有一个界面!请参阅下面的答案。

一个解决方案是拥有一个包装服务客户端的类,只重新发送参数并返回结果:

public class ClientProxy : IClientProxy
{
    public MyWCFServiceCustomer GetCustomer(int customerId)
    {
        var client = new MyWCFServiceClient();
        return client.GetCustomer(customerId);
    }
}
public interface IClientProxy
{
    MyWCFServiceCustomer GetCustomer(int customerId);
}

这样我可以给该类一个接口,从而模拟它。但是编写“代理”类并保持更新似乎很乏味,所以我希望你有更好的解决方案! :)

2 个答案:

答案 0 :(得分:0)

您应该看一下这篇文章here

您可以使用ClientBase<IServiceContract> buggy anyway,而不是使用ServiceReference代理(directly - 处置客户端始终尝试关闭连接,即使它已出现故障)。

您可以使用ServiceReference创建的代理服务合同接口,或者如果您可以控制链接的两端,则可以将ServiceContract接口构建到单独的程序集中并在客户端和服务器上共享它。

答案 1 :(得分:0)

我的不好......实际上是生成的服务类的接口。我在寻找更多时找到了它。它只是没有我期望的名称(在我的例子中,如果客户端被称为MyWCFServiceClient,我希望该接口被称为IMyWCFServiceClient,但它实际上被称为IMyWCFService)。

所以我可以重写我的控制器以注入服务客户端,从而使其成为可模拟的:

public class MyRepository : IMyRepository
{
    private readonly IMyWCFService _serviceClient;

    //Constructor
    public MyRepository(IMyWCFService serviceClient)
    {
        _serviceClient = serviceClient;
    }

    public Customer GetCustomer(int customerId)
    {
        MyWCFServiceCustomer customerWCF = _serviceClient.GetCustomer(customerId);
        Customer customer = ConvertCustomer(customerWCF);
        return customer;
    }

    //Convert a customer object recieved from the WCF service to a customer of
    //the type used in this project.
    private Customer ConvertCustomer(MyWCFServiceCustomer customerWCF)
    {
        Customer customer = new Customer();
        customer.Id = customerWCF.Id;
        customer.Name = customerWCF.Name;
        return customer;
    }
}