Skip to content

Commit 3dedd51

Browse files
authored
Release/v0.3.0 (#4)
* assert 処理を `TestActual` の責務として統合。 * `TestAA` の既定の assert ロジックを `TestAssert` によってインジェクションできるよう対応。 * `Assert()` の others パラメーターを削除。 * `Assert()` の @return と exception の評価順序を exception を先にするよう更新。 * `TestAssertException` を削除し、既定の `TestAssert` がテスト失敗時にスローする `TestAssertFailedException` を追加。 * readme を更新。
1 parent f3a238f commit 3dedd51

20 files changed

+852
-512
lines changed

README.md

Lines changed: 55 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
```cs
1919
TestAA
2020
.Act(テスト対象コード)
21-
.Assert(テスト対象コードの戻り値の検証, 例外の検証, その他の検証);
21+
.Assert(テスト対象コードの戻り値の検証, 例外の検証);
2222
```
2323

2424
Arrange に相当する処理は `TestAA.Act()` の呼び出しより前に記述します。
@@ -30,7 +30,7 @@ Arrange に相当する処理は `TestAA.Act()` の呼び出しより前に記
3030
TestAA.Act(...)
3131
```
3232

33-
`Act()` の引数には、テスト対象となるメソッドまたはコードのラムダ式やデリゲートを渡して下さい。テストの対象ではないメソッドまたはコードも含めますと、そこから発生した例外がテスト対象コードから生じたものとして扱われてしまい、正しい検証が行えなくなります。
33+
`Act()` の引数には、テスト対象となるメソッドまたはコードのラムダ式やデリゲートを渡して下さい。テストの対象ではないメソッドやコードを含めますと、そこから発生した例外がテスト対象コードから生じたものとして扱われてしまい、正しい検証が行えなくなります。
3434
```cs
3535
TestAA.Act(() => { /* ここでテスト対象のメソッドを呼ぶ */ })
3636
```
@@ -39,63 +39,72 @@ TestAA.Act(() => { /* ここでテスト対象のメソッドを呼ぶ */ })
3939
```cs
4040
.Act(() => int.Parse("123"))
4141
.Assert(
42-
@return: ret => { /* ここで戻り値の検証 */ },
43-
exception: ex => { /* ここで例外の検証。省略した場合、Act() で例外が生じていれば再スローされる */ },
44-
others: () => { /* ここで上記以外の検証。不要なら省略 */ }
42+
@return: ret => { /* ここで戻り値の検証。Act で例外が生じた場合は戻り値が無いので呼ばれない */ },
43+
exception: ex => { /* ここで例外の検証 */ }
4544
);
4645
```
4746

47+
検証はラムダ式やデリゲートではなく値を直接入力する事でも可能です。テストの失敗は、既定では `TestAssertFailedException` のスローによって通知されます。
48+
```cs
49+
TestAA.Act(() => int.Parse("123")).Assert(123); // OK
50+
TestAA.Act(() => int.Parse("abc")).Assert(ret => { }, new FormatException()); // OK
51+
TestAA.Act(() => int.Parse("abc")).Assert(123); // TestAssertFailedException
52+
```
53+
4854

49-
## Usage
55+
## Examples
56+
### Basic
5057
```cs
51-
public void IntParseTest() {
52-
// Success
53-
TestAA.Act(() => int.Parse("123")).Assert(
54-
ret => ret.Is(123)
55-
);
58+
TestAA.Act(() => int.Parse("123")).Assert(123);
59+
```
60+
### Exception
61+
```cs
62+
TestAA.Act(() => int.Parse("abc")).Assert(ret => { }, exception: new FormatException());
63+
```
5664

57-
// FormatException
58-
TestAA.Act(() => int.Parse("abc")).Assert(
59-
ret => { },
60-
ex => ex?.GetType().Is(typeof(FormatException))
61-
);
62-
}
65+
### Out parameter
66+
```cs
67+
int result = default;
68+
TestAA.Act(() => int.TryParse("123", out result)).Assert(true);
69+
70+
// Additional Assert
71+
Assert.AreEqual(123, result);
6372
```
6473

65-
下記は *MSTest* を利用した、より実践的な例です:
74+
### Lambda assert
6675
```cs
67-
[DataTestMethod]
68-
[DataRow(0, null, null, typeof(ArgumentNullException))]
69-
[DataRow(1, "123", 123, null)]
70-
[DataRow(2, "abc", null, typeof(FormatException))]
71-
public void IntParseTest(int testNumber, string input, int expected, Type expectedExceptionType) {
72-
var msg = "No." + testNumber;
76+
TestAA.Act(() => int.Parse("123")).Assert(
77+
@return: ret => Assert.AreEqual(123, ret)
78+
, exception: ex => Assert.IsNull(ex)
79+
);
80+
```
7381

74-
TestAA.Act(() => int.Parse(input)).Assert(
75-
ret => Assert.AreEqual(expected, ret, msg),
76-
ex => Assert.AreEqual(expectedExceptionType, ex?.GetType(), msg)
77-
);
82+
### Replace default assert
83+
```cs
84+
class MSTestAssert : TestAssert {
85+
public override void Is<T>(T actual, T expected, string message) {
86+
Assert.AreEqual(expected, actual, message);
87+
}
7888
}
89+
...
90+
TestAA.TestAssert = new MSTestAssert();
91+
92+
TestAA.Act(() => int.Parse("123")).Assert(123); // Assert.AreEqual()
7993
```
80-
または
94+
95+
### Test cases
8196
```cs
82-
[TestMethod]
83-
public void IntParseTest() {
84-
Action TestCase(int testNumber, string input, int expected, Type expectedExceptionType = null) => () => {
85-
var msg = "No." + testNumber;
86-
87-
TestAA.Act(() => int.Parse(input)).Assert(
88-
ret => Assert.AreEqual(expected, ret, msg),
89-
ex => Assert.AreEqual(expectedExceptionType, ex?.GetType(), msg)
90-
);
91-
};
92-
93-
foreach (var action in new[] {
94-
TestCase( 0, null , expected: 0 , expectedExceptionType: typeof(ArgumentNullException)),
95-
TestCase( 1, "abc", expected: 0 , expectedExceptionType: typeof(FormatException)),
96-
TestCase( 2, "123", expected: 123),
97-
}) { action(); }
98-
}
97+
Action TestCase(int testNumber, string input, int expected, Exception expectedException = null) => () => {
98+
var msg = "No." + testNumber;
99+
100+
TestAA.Act(() => int.Parse(input)).Assert(expected, expectedException, msg);
101+
};
102+
103+
foreach (var action in new[] {
104+
TestCase( 0, null , expected: 0 , expectedException: new ArgumentNullException()),
105+
TestCase( 1, "abc", expected: 0 , expectedException: new FormatException()),
106+
TestCase( 2, "123", expected: 123),
107+
}) { action(); }
99108
```
100109

101110

appveyor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ deploy:
1616
appveyor_repo_tag: true
1717
- provider: NuGet
1818
api_key:
19-
secure: vQBIGqLxb5sEvl0To9hWNmzmzaXw4INcIDqrPjj5pjQoLuYQzDj9mrqEdJI6NZJK
19+
secure: 5auKjaKm29nXAKSDhhZOM1V+1H+MsUwIRi8xw+vZa4t9rlhg2hHX+BExGh/8XOAd
2020
on:
2121
appveyor_repo_tag: true

src/Inasync.TestAA/Inasync.TestAA.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
<Description>TestAA is a simple library to support writing tests using Arrange-Act-Assert (AAA) pattern.</Description>
99
<PackageProjectUrl>https://github.com/in-async/TestAA</PackageProjectUrl>
1010
<PackageLicenseUrl>https://github.com/in-async/TestAA/blob/master/LICENSE</PackageLicenseUrl>
11-
<PackageTags>library test unittest aaa</PackageTags>
12-
<Version>0.2.1</Version>
11+
<PackageTags>library test unittest AAA</PackageTags>
12+
<Version>0.3.0</Version>
1313
</PropertyGroup>
1414

1515
</Project>

src/Inasync.TestAA/TestAA.Act.cs

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
25

36
namespace Inasync {
47

@@ -36,12 +39,66 @@ public static TestActual<TReturn> Act<TReturn>(Func<TReturn> act) {
3639
if (act == null) { throw new ArgumentNullException(nameof(act)); }
3740

3841
try {
39-
var @return = act();
40-
return new TestActual<TReturn>(@return, exception: null);
42+
var ret = act();
43+
return new TestActual<TReturn>(@return: ret);
4144
}
4245
catch (Exception ex) {
43-
return new TestActual<TReturn>(default, exception: ex);
46+
return new TestActual<TReturn>(exception: ex);
4447
}
4548
}
4649
}
50+
51+
public static partial class TestAA {
52+
53+
/// <summary>
54+
/// テスト対象の非同期デリゲートを同期的に実行します。
55+
/// </summary>
56+
/// <param name="act">テスト対象の非同期デリゲート。</param>
57+
/// <returns>非同期デリゲートの実行結果。</returns>
58+
/// <exception cref="ArgumentNullException"><paramref name="act"/> is <c>null</c>.</exception>
59+
public static TestActual Act(Func<Task> act) {
60+
if (act == null) { throw new ArgumentNullException(nameof(act)); }
61+
62+
return Act(() => act().GetAwaiter().GetResult());
63+
}
64+
65+
/// <summary>
66+
/// テスト対象の非同期デリゲートを同期的に実行します。
67+
/// </summary>
68+
/// <typeparam name="TReturn">テスト対象の非同期デリゲートの戻り値の型。</typeparam>
69+
/// <param name="act">テスト対象の非同期デリゲート。</param>
70+
/// <returns>非同期デリゲートの実行結果。</returns>
71+
/// <exception cref="ArgumentNullException"><paramref name="act"/> is <c>null</c>.</exception>
72+
public static TestActual<TReturn> Act<TReturn>(Func<Task<TReturn>> act) {
73+
if (act == null) { throw new ArgumentNullException(nameof(act)); }
74+
75+
return Act(() => act().GetAwaiter().GetResult());
76+
}
77+
78+
/// <summary>
79+
/// テスト対象のデリゲートを実行し、戻り値のシーケンスを配列化します。
80+
/// </summary>
81+
/// <typeparam name="TItem">テスト対象のデリゲートが戻り値とするシーケンスの要素の型。</typeparam>
82+
/// <param name="act">テスト対象のデリゲート。</param>
83+
/// <returns>デリゲートの実行結果。</returns>
84+
/// <exception cref="ArgumentNullException"><paramref name="act"/> is <c>null</c>.</exception>
85+
public static TestActual<TItem[]> Act<TItem>(Func<IEnumerable<TItem>> act) {
86+
if (act == null) { throw new ArgumentNullException(nameof(act)); }
87+
88+
return Act(() => act().ToArray());
89+
}
90+
91+
/// <summary>
92+
/// テスト対象の非同期デリゲートを同期的に実行し、戻り値のシーケンスを配列化します。
93+
/// </summary>
94+
/// <typeparam name="TItem">テスト対象の非同期デリゲートが戻り値とするシーケンスの要素の型。</typeparam>
95+
/// <param name="act">テスト対象の非同期デリゲート。</param>
96+
/// <returns>非同期デリゲートの実行結果。</returns>
97+
/// <exception cref="ArgumentNullException"><paramref name="act"/> is <c>null</c>.</exception>
98+
public static TestActual<TItem[]> Act<TItem>(Func<Task<IEnumerable<TItem>>> act) {
99+
if (act == null) { throw new ArgumentNullException(nameof(act)); }
100+
101+
return Act(() => act().GetAwaiter().GetResult().ToArray());
102+
}
103+
}
47104
}

src/Inasync.TestAA/TestAA.ActExtensions..cs

Lines changed: 0 additions & 61 deletions
This file was deleted.

src/Inasync.TestAA/TestAA.Assert.cs

Lines changed: 0 additions & 47 deletions
This file was deleted.

0 commit comments

Comments
 (0)