Easy way to mock a WCF service?

前端 未结 3 431
清歌不尽
清歌不尽 2020-12-28 23:54

I\'ve got an app which is using a WCF service. Now I\'d like to add unit tests to the app.

For some cases I need to mock the WCF service, since getting the desired b

相关标签:
3条回答
  • 2020-12-29 00:26

    You can use any mocking framework like RhinoMocks or NMock, to mock out the interface contract, so if your service implemented IMyService then you could use a mocking framework to set expectations on the method calls on that interface. If you are not familiar with this concept then you can simply create a stand-in object that implements IMyService but pretends to be the real service during your testing. This way when the methods are called they are called on your stand-in object and you can have your stand-in return whatever you want it to.

    0 讨论(0)
  • 2020-12-29 00:31

    You can you Moq mocking framework. Based on the example that you have provided:

    ChannelFactory<IMyWcfService> channelFactory = new ChannelFactory<IMyWcfService>("");
    IMyWcfService proxy = channelFactory.CreateChannel();
    proxy.CallMyStuff();
    proxy.Close();
    

    Here is how a mocking implementation will look like:

    Mock<IMyWcfServiceChannel> channelMock = new Mock<IMyWcfServiceChannel>(MockBehavior.Strict);
    channelMock
        .Setup(c => c.CallMyStuff())
        .Returns("");
    
    string myStuff = channelMock.Object.CallMyStuff();
    

    After you have added a proxy for the WCF service - you should have a channel interface available to you, called IMyWcfServiceChannel.

    Depending on the return type of service method you are calling - you can set just about any output. In the example above I used string type as an example.

    In order to use the above solution more efficiently you might want to create 2 constructors for the business layer like so:

    public class Example1
    {
        IMyWcfServiceChannel _client;
    
        public Example1()
        {
            var factory = new ChannelFactory<IMyWcfServiceChannel>("binding");
            _client = factory.CreateChannel();
        }
    
        public Example1(IMyWcfServiceChannel client)
        {
            _client = client;
        }
    
        public string CallMyStuff()
        {
            return _client.CallMyStuff();
        }
    }
    

    So on the prod you use parameter-less constructor. In unit tests you use parameter-full constructor and pass mock to it (channelMock.Object).

    0 讨论(0)
  • 2020-12-29 00:41

    Why can't you use something like NMock2 to mock the IMyWcfService interfaces directly?

    If you need to be able to create new instances on the fly, use the Factory to hide the ChannelFactory<IMyWcfService> from the client. This way you can replace the factory, providing the client one which creates mocks instead of real proxies.

    0 讨论(0)
提交回复
热议问题