前面的文章,我们使用WCF构建一个简单的REST的WCF Service。之前我们使用Fiddler来测试,现在还可以使用WCF Web API来测试。代码看来起更加简洁
首先,你可从CODEPLEX下载,也可以从NuGet安装它,执行:
Install-Package netfx-WebApi.Testing
WCF HTTP高层架构是这样的:
基于上次的DEMO,我们使用来写一些UnitTest,传统方式我们不使用Proxy方式,使用ServiceHost和ChannelFactory,下面是测试Http-GET的方法
1: [TestMethod]
2: public void TestChannelFactoryWithWebHttpBinding2()
3: {
4: using (var myserviceHost = new ServiceHost(typeof(CRUDService), new Uri("http://localhost:20259/CRUDService.svc")))
5: {
6: var binding = new WebHttpBinding();
7: myserviceHost.AddServiceEndpoint(typeof(IDataService), binding, "").Behaviors.Add(new WebHttpBehavior());
8: myserviceHost.Open();
9:
10: using (ChannelFactory<IDataService> myChannelFactory = new ChannelFactory<IDataService>(new WebHttpBinding(), "http://localhost:20259/CRUDService.svc"))
11: {
12: myChannelFactory.Endpoint.Behaviors.Add(new WebHttpBehavior());
13:
14: // Create a channel.
15: IDataService wcfClient1 = myChannelFactory.CreateChannel();
16: var employee = wcfClient1.Get(1);
17: Assert.IsNotNull(employee);
18: Assert.AreEqual(1,employee.EmployeeID);
19:
20: ((IClientChannel)wcfClient1).Close();
21: myChannelFactory.Close();
22: }
23:
24: myserviceHost.Close();
25: }
26: }
接下来我们使用WCF Web API来测试Service中CRUD的四个方法,对Create我使用是Http-POST,Delete是Http-DELETE,Update用的是Http-PUT,Get是Http-GET.
1: /// <summary>
2: /// CRUDServiceTest
3: /// </summary>
4: /// <remarks>
5: /// Author Petter Liu http://www.cnblogs.com/wintersun
6: /// </remarks>
7: [TestClass]
8: public class CRUDServiceTest
9: {
10: #region Public Methods
11:
12: /// <summary>
13: /// The test create.
14: /// </summary>
15: [TestMethod]
16: public void TestCreate()
17: {
18: using (
19: var webservice = new HttpWebService<CRUDService>(
20: serviceBaseUrl: "http://localhost:20259",
21: serviceResourcePath: "CRUDService.svc",
22: serviceConfiguration: HttpHostConfiguration.Create()))
23: {
24: var client = new HttpClient(webservice.BaseUri);
25:
26: // Builds: http://localhost:20259/CRUDService.svc/Create
27: Uri uri = webservice.Uri("Create");
28:
29: var employee = new Employee
30: {
31: ContactID = 1,
32: ManagerID = 23,
33: Title = "Engineer",
34: Gender = "1",
35: CurrentFlag = false,
36: NationalIDNumber = "32323"
37: };
38:
39: var httpcontent = new FormUrlEncodedContent(this.GetEntityToListKeyValuePair(employee));
40: HttpResponseMessage response = client.Post(uri, httpcontent);
41:
42: Assert.IsTrue(response.IsSuccessStatusCode, response.ToString());
43: Assert.IsTrue(response.Content.ReadAsString().Contains("true"));
44: }
45: }
46:
47: /// <summary>
48: /// The test delete.
49: /// </summary>
50: [TestMethod]
51: public void TestDelete()
52: {
53: using (
54: var webservice = new HttpWebService<CRUDService>(
55: serviceBaseUrl: "http://localhost:20259",
56: serviceResourcePath: "CRUDService.svc",
57: serviceConfiguration: HttpHostConfiguration.Create()))
58: {
59: var client = new HttpClient(webservice.BaseUri);
60:
61: // Builds: http://localhost:20259/CRUDService.svc/Del?id=1
62: Uri uri = webservice.Uri("Del?id=1");
63:
64: HttpResponseMessage response = client.Delete(uri);
65:
66: Assert.IsTrue(response.IsSuccessStatusCode, response.ToString());
67: Assert.IsTrue(response.Content.ReadAsString().Contains("true"));
68: }
69: }
70:
71: /// <summary>
72: /// Test get.
73: /// </summary>
74: [TestMethod]
75: public void TestGet()
76: {
77: using (
78: var webservice = new HttpWebService<CRUDService>(
79: serviceBaseUrl: "http://localhost:20259",
80: serviceResourcePath: "CRUDService.svc",
81: serviceConfiguration: HttpHostConfiguration.Create()))
82: {
83: var client = new HttpClient(webservice.BaseUri);
84:
85: // Builds: http://localhost:20259/CRUDService.svc/Get?id=1
86: Uri uri = webservice.Uri("Get?id=1");
87: HttpResponseMessage response = client.Get(uri);
88:
89: Assert.IsTrue(response.IsSuccessStatusCode, response.ToString());
90:
91: // Console.WriteLine(response.Content.ReadAsString());
92: Assert.IsTrue(response.Content.ReadAsString().Contains("11"));
93: }
94: }
95:
96: /// <summary>
97: /// Test update.
98: /// </summary>
99: [TestMethod]
100: public void TestUpdate()
101: {
102: using (
103: var webservice = new HttpWebService<CRUDService>(
104: serviceBaseUrl: "http://localhost:20259",
105: serviceResourcePath: "CRUDService.svc",
106: serviceConfiguration: HttpHostConfiguration.Create()))
107: {
108: var client = new HttpClient(webservice.BaseUri);
109:
110: // Builds: http://localhost:20259/CRUDService.svc/Update?id=1
111: Uri uri = webservice.Uri("Update?id=1");
112:
113: // fake http content
114: var keyvalus = new List<KeyValuePair<string, string>>();
115: keyvalus.Add(new KeyValuePair<string, string>("employeeId", "1"));
116: HttpResponseMessage response = client.Put(uri, new FormUrlEncodedContent(keyvalus));
117:
118: Assert.IsTrue(response.IsSuccessStatusCode, response.ToString());
119: Assert.IsTrue(response.Content.ReadAsString().Contains("true"));
120: }
121: }
122:
123: #endregion
124:
125: #region Private Helper Methods
126:
127: /// <summary>
128: /// The get entity to list key value pair.
129: /// </summary>
130: /// <param name="employee">
131: /// The employee.
132: /// </param>
133: /// <returns>
134: /// </returns>
135: private List<KeyValuePair<string, string>> GetEntityToListKeyValuePair(Employee employee)
136: {
137: var keyvalus = new List<KeyValuePair<string, string>>();
138:
139: foreach (PropertyInfo po in
140: employee.GetType().GetProperties())
141: {
142: object rr = po.GetValue(employee, null);
143:
144: if (rr != null)
145: {
146: // parse datatime and guid and bool type has some issue
147: if (!rr.ToString().Contains('/') && !rr.ToString().Contains('-') && !rr.ToString().Contains("False"))
148: {
149: keyvalus.Add(new KeyValuePair<string, string>(po.Name, rr.ToString()));
150: Console.WriteLine("{0}: {1}", po.Name, rr);
151: }
152: }
153: }
154:
155: return keyvalus;
156: }
157:
158: #endregion
159: }
上面的代码中,ServiceBaseUrl指定就是Endpoint的address了,注意测试时我们并不需要事先创建ServiceHost。你可以有使用过WebServiceHost,这里使用是HttpWebService,区别在于后者是经过Http pipe API的.
希望这篇POST对您开发有帮助。
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。