8

GetAwesomeResultsAsXml()次の WCF Rest Service 用に書かれた単体テスト (より多くの統合テスト) を取得しようとしています。嘲笑
の側面にどう対処すればよいですか? 最善のアプローチは何ですか? WebOperationContext

public class AwesomeRestService : AwesomeRestServiceBase, IAwesomeRestService
    {
        public AwesomeSearchResults<AwesomeProductBase> GetAwesomeResultsAsXml()
        {
            return GetResults();
        }

        private static AwesomeSearchResults<AwesomeProductBase> GetResults()
        {
            var searchContext = AwesomeSearchContext
                               .Parse(WebOperationContext.Current);
            ..............
            ..............
            ..............
        }


    }

[ServiceContract]
    public interface IAwesomeRestService
    {
        [OperationContract]
        [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml,
        BodyStyle =  WebMessageBodyStyle.Bare,
            UriTemplate = "/search/xml")]
        AwesomeQueryResults<AwesomeProductBase> GetAwesomeResultsAsXml();


    }







public class AwesomeSearchContext
        {
            ................
            ................
            ................
             public static AwesomeSearchContext Parse 
                                           (WebOperationContext operationContext)
            {
                return WebOperationContext.Current != null ? new     
 AwesomeSearchContext(operationContext.IncomingRequest.UriTemplateMatch.QueryParameters) : null;
            }
        }
4

5 に答える 5

9

私は同じ問題に遭遇しました。IIS を使用せずに、WCF サービス関数 (以下の例の IOauth2 インターフェイス用) を単体テストしたいと考えています。これは、準備のためのコード スニペットです。

// Prepare WebOperationContext
var factory = new ChannelFactory<IOauth2>(
    new WebHttpBinding(),
    new EndpointAddress("http://localhost:80"));

OperationContext.Current = new OperationContext(factory.CreateChannel() as IContextChannel);
Debug.Assert(WebOperationContext.Current != null);
于 2014-05-22T09:12:24.613 に答える
3

Sanjay の回答に従い、MS の偽のフレームワークを試してみました。

まず、あなたがしなければならないopen "Solution Explorer > your test project > Reference"=> right-click the "System.ServiceModel.Web"=>press "add Fakes Assembly"

参照:

using Microsoft.QualityTools.Testing.Fakes;
using System.ServiceModel.Web.Fakes;

サンプル:

using (ShimsContext.Create())
{
    var response = new ShimOutgoingWebResponseContext();
    var request = new ShimIncomingWebRequestContext();

    var ctx_hd = new WebHeaderCollection();
    ctx_hd.Add("myCustomHeader", "XXXX");
    request.HeadersGet = () => ctx_hd;

    var ctx = new ShimWebOperationContext
    {
        OutgoingResponseGet = () => response,
        IncomingRequestGet = () => request
    };
    ShimWebOperationContext.CurrentGet = () => ctx;

    //Test your code here...
}

これで、WCF サービス コードで WebOperationContext.Current.IncomingRequest.Headers["myCustomHeader"] を取得できるようになりました。

MSDN の MS Fakes フレームワークの詳細: https://msdn.microsoft.com/en-us/library/hh549176.aspx

于 2015-09-25T07:34:07.140 に答える
2

これに対する一般的なアプローチは、moq ( https://code.google.com/p/moq/ ) や rhinomocks のようなツールをモックすることです。

静的メンバーをモックできないため、webcontext.current への呼び出しをラップする必要があります。静的 mmember をラップして moq でテストする例を次に示します。 moq で静的プロパティをモックする

于 2013-04-18T08:57:35.163 に答える
1

MS Fakes フレームワークをまだ使用していない場合はやり過ぎかもしれませんが、使用している場合はこれでうまくいきます。

using (ShimsContext.Create())
        {

            var response = new ShimOutgoingWebResponseContext();
            var ctx = new ShimWebOperationContext
            {
                OutgoingResponseGet = () => response
            };

            ShimWebOperationContext.CurrentGet = () => ctx;

            try
            {
                ParameterInspector.BeforeCall("operationName", new string[]{"some_argument"} );
            }
            catch (Exception e)
            {
                Assert.IsNull(e);
            }
        }
于 2013-11-01T17:52:39.450 に答える
0

Create a client for your service, and then handle the OperationContext within the client:

public class AwesomeRestServiceClient : ClientBase<IAwesomeRestService>, IAwesomeRestService
{
    public class AwesomeRestServiceClient(string address)
        : base(new WebHttpBinding(), new EndpointAddress(address))
    {   
        this.Endpoint.EndpointBehaviors.Add(new WebHttpBehavior());
    }

    public AwesomeSearchResults<AwesomeProductBase> GetAwesomeResultsAsXml()
    {
        using (new OperationContextScope(this.InnerChannel))
        {
            return base.Channel.GetAwesomeResultsAsXml();
        }
    }
}

For further info on how to use this, see this answer.

于 2021-05-24T19:09:17.530 に答える