Skip to content

Commit 4f308e1

Browse files
committed
Context的单元测试
1 parent 922b350 commit 4f308e1

File tree

8 files changed

+222
-18
lines changed

8 files changed

+222
-18
lines changed

WebApiClient.Test/Attributes/TestActionContext.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Net.Http;
4-
using System.Text;
53
using WebApiClient.Contexts;
64

75
namespace WebApiClient.Test
86
{
9-
class TestActionContext : Contexts.ApiActionContext
7+
class TestActionContext : ApiActionContext
108
{
119
/// <summary>
1210
/// 请求Api的上下文
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using WebApiClient.Contexts;
2+
using Xunit;
3+
4+
namespace WebApiClient.Test.Contexts
5+
{
6+
public class ApiActionDescriptorTest
7+
{
8+
[Fact]
9+
public void NewTest()
10+
{
11+
var m = typeof(IUserApi).GetMethod("Get1");
12+
var d = new ApiActionDescriptor(m);
13+
14+
Assert.True(d.Attributes.Count == 3);
15+
Assert.True(d.Filters.Count == 1);
16+
Assert.True(d.Parameters.Count == 2);
17+
Assert.True(d.Name == m.Name);
18+
Assert.True(d.Member == m);
19+
Assert.True(d.Return.ReturnType == m.ReturnType);
20+
}
21+
22+
[Fact]
23+
public void CloneTest()
24+
{
25+
var m = typeof(IUserApi).GetMethod("Get1");
26+
var d = new ApiActionDescriptor(m);
27+
var d2 = d.Clone(new object[] { null, null });
28+
29+
Assert.True(d.Attributes == d2.Attributes);
30+
Assert.True(d.Name == d2.Name);
31+
Assert.True(d.Filters == d2.Filters);
32+
Assert.True(d.Member == d2.Member);
33+
Assert.True(d.Parameters != d2.Parameters);
34+
Assert.True(d.Parameters.Count == d2.Parameters.Count);
35+
Assert.True(d.Return == d2.Return);
36+
}
37+
}
38+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using WebApiClient.Contexts;
2+
using Xunit;
3+
4+
namespace WebApiClient.Test.Contexts
5+
{
6+
public class ApiParameterDescriptorTest
7+
{
8+
[Fact]
9+
public void NewTest()
10+
{
11+
var p1 = typeof(IUserApi).GetMethod("Get2").GetParameters()[0];
12+
var m1 = new ApiParameterDescriptor(p1);
13+
Assert.True(m1.Attributes.Count == 1);
14+
Assert.True(m1.Index == 0);
15+
Assert.True(m1.Member == p1);
16+
Assert.True(m1.Name == p1.Name);
17+
Assert.True(m1.ParameterType == p1.ParameterType);
18+
Assert.True(m1.ValidationAttributes.Count == 1);
19+
Assert.True(m1.Value == null);
20+
21+
22+
var p2 = typeof(IUserApi).GetMethod("Get2").GetParameters()[1];
23+
var m2 = new ApiParameterDescriptor(p2);
24+
Assert.True(m2.Attributes.Count == 1);
25+
Assert.True(m2.Index == 1);
26+
Assert.True(m2.Member == p2);
27+
Assert.True(m2.Name == p2.Name);
28+
Assert.True(m2.ParameterType == p2.ParameterType);
29+
Assert.True(m2.ValidationAttributes.Count == 0);
30+
Assert.True(m2.Value == null);
31+
}
32+
33+
34+
[Fact]
35+
public void CloneTest()
36+
{
37+
var p1 = typeof(IUserApi).GetMethod("Get2").GetParameters()[0];
38+
var m1 = new ApiParameterDescriptor(p1);
39+
var m2 = m1.Clone(10);
40+
41+
Assert.True(m1.Attributes == m2.Attributes);
42+
Assert.True(m1.Name == m2.Name);
43+
Assert.True(m1.Index == m2.Index);
44+
Assert.True(m1.ParameterType == m2.ParameterType);
45+
Assert.True(m1.Member == m2.Member);
46+
Assert.True(m1.ValidationAttributes == m2.ValidationAttributes);
47+
Assert.True((int)m2.Value == 10);
48+
}
49+
}
50+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using WebApiClient.Attributes;
2+
using WebApiClient.Contexts;
3+
using Xunit;
4+
5+
namespace WebApiClient.Test.Contexts
6+
{
7+
public class ApiReturnDescriptorTest
8+
{
9+
[Fact]
10+
public void NewTest()
11+
{
12+
var m1 = new ApiReturnDescriptor(typeof(IUserApi).GetMethod("Get1"));
13+
var m2 = new ApiReturnDescriptor(typeof(IUserApi).GetMethod("Get2"));
14+
15+
Assert.True(m1.IsTaskDefinition);
16+
Assert.True(m1.Attribute.GetType() == typeof(AutoReturnAttribute));
17+
18+
Assert.True(m2.IsITaskDefinition);
19+
Assert.True(m2.Attribute.GetType() == typeof(JsonReturnAttribute));
20+
}
21+
}
22+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System.Linq;
2+
using WebApiClient.Contexts;
3+
using Xunit;
4+
5+
namespace WebApiClient.Test.Contexts
6+
{
7+
public class DataTypeDescriptorTest
8+
{
9+
private DataTypeDescriptor Create(string methodName)
10+
{
11+
var method = typeof(IUserApi).GetMethod(methodName);
12+
var dataType = method.ReturnType.GetGenericArguments().FirstOrDefault();
13+
return new DataTypeDescriptor(dataType);
14+
}
15+
16+
[Fact]
17+
public void NewTest()
18+
{
19+
var m1 = Create("Get1");
20+
var m2 = Create("Get2");
21+
var m3 = Create("Get3");
22+
var m4 = Create("Get4");
23+
var m5 = Create("Get5");
24+
var m6 = Create("Get6");
25+
26+
Assert.True(m1.IsString);
27+
Assert.True(m2.IsHttpResponseMessage);
28+
Assert.True(m3.IsStream);
29+
Assert.True(m4.IsHttpResponseWrapper);
30+
Assert.True(m6.IsByteArray);
31+
Assert.False(m5.IsString || m5.IsStream || m5.IsByteArray || m5.IsHttpResponseMessage || m5.IsHttpResponseWrapper);
32+
}
33+
}
34+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using System.IO;
3+
using System.Net.Http;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using WebApiClient.Attributes;
7+
using WebApiClient.Parameterables;
8+
9+
namespace WebApiClient.Test.Contexts
10+
{
11+
/// <summary>
12+
/// 用户操作接口
13+
/// </summary>
14+
[TraceFilter]
15+
[HttpHost("http://localhost")]
16+
public interface IUserApi : IHttpApi
17+
{
18+
[HttpGet]
19+
[Timeout(10 * 1000)]
20+
Task<string> Get1([Uri] string url, string something);
21+
22+
[HttpGet]
23+
[JsonReturn]
24+
ITask<HttpResponseMessage> Get2([Required]string id, CancellationToken token);
25+
26+
[HttpGet]
27+
ITask<Stream> Get3([Required]string account, CancellationToken token);
28+
29+
[HttpGet]
30+
ITask<HttpResponseFile> Get4([Uri, Required] string uri);
31+
32+
33+
[HttpGet]
34+
ITask<object> Get5(string nickName);
35+
36+
[HttpGet]
37+
ITask<byte[]> Get6(string nickName);
38+
}
39+
}

WebApiClient/Attributes/ReturnAttributes/AutoReturnAttribute.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,22 @@ protected override async Task<object> GetTaskResult(ApiActionContext context)
4848
var response = context.ResponseMessage;
4949
var dataType = context.ApiActionDescriptor.Return.DataType;
5050

51-
if (dataType.Type == typeof(HttpResponseMessage))
51+
if (dataType.IsHttpResponseMessage == true)
5252
{
5353
return response;
5454
}
5555

56-
if (dataType.Type == typeof(string))
56+
if (dataType.IsString == true)
5757
{
5858
return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
5959
}
6060

61-
if (dataType.Type == typeof(byte[]))
61+
if (dataType.IsByteArray == true)
6262
{
6363
return await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
6464
}
6565

66-
if (dataType.Type == typeof(Stream))
66+
if (dataType.IsStream == true)
6767
{
6868
return await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
6969
}

WebApiClient/Contexts/DataTypeDescriptor.cs

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
22
using System.Diagnostics;
3+
using System.IO;
4+
using System.Net.Http;
35
using System.Reflection;
46

57
namespace WebApiClient.Contexts
@@ -20,11 +22,6 @@ public class DataTypeDescriptor
2022
/// </summary>
2123
public Type Type { get; protected set; }
2224

23-
/// <summary>
24-
/// 获取是否为HttpResponseWrapper子类型
25-
/// </summary>
26-
public bool IsHttpResponseWrapper { get; protected set; }
27-
2825
/// <summary>
2926
/// 获取包装为ITask的创建工厂
3027
/// </summary>
@@ -35,23 +32,49 @@ public class DataTypeDescriptor
3532
/// </summary>
3633
public ConstructorInfo ITaskConstructor { get; protected set; }
3734

35+
36+
/// <summary>
37+
/// 获取是否为String类型
38+
/// </summary>
39+
public bool IsString { get; protected set; }
40+
41+
/// <summary>
42+
/// 获取是否为Stream类型
43+
/// </summary>
44+
public bool IsStream { get; protected set; }
45+
46+
/// <summary>
47+
/// 获取是否为byte[]类型
48+
/// </summary>
49+
public bool IsByteArray { get; protected set; }
50+
51+
/// <summary>
52+
/// 获取是否为HttpResponseMessage类型
53+
/// </summary>
54+
public bool IsHttpResponseMessage { get; protected set; }
55+
56+
/// <summary>
57+
/// 获取是否为HttpResponseWrapper子类型
58+
/// </summary>
59+
public bool IsHttpResponseWrapper { get; protected set; }
60+
3861
/// <summary>
3962
/// 返回的Task(Of T)的T类型描述
4063
/// </summary>
4164
/// <param name="dataType">数据类型</param>
4265
/// <exception cref="ArgumentNullException"></exception>
4366
public DataTypeDescriptor(Type dataType)
4467
{
45-
if (dataType == null)
46-
{
47-
throw new ArgumentNullException(nameof(dataType));
48-
}
68+
this.Type = dataType ?? throw new ArgumentNullException(nameof(dataType));
4969

5070
var taskType = typeof(ApiTask<>).MakeGenericType(dataType);
51-
52-
this.Type = dataType;
5371
this.ITaskFactory = Lambda.CreateNewFunc<ITask>(taskType);
5472
this.ITaskConstructor = taskType.GetConstructor(emptyTypes);
73+
74+
this.IsString = dataType == typeof(string);
75+
this.IsStream = dataType == typeof(Stream);
76+
this.IsByteArray = dataType == typeof(byte[]);
77+
this.IsHttpResponseMessage = dataType == typeof(HttpResponseMessage);
5578
this.IsHttpResponseWrapper = dataType.IsInheritFrom<HttpResponseWrapper>();
5679
}
5780
}

0 commit comments

Comments
 (0)