Skip to content

Commit

Permalink
テストクラスのベースクラスを作成しテストコードを更新する (#804)
Browse files Browse the repository at this point in the history
* 単体テストプロジェクトにLoggerを使うテストクラスのベースクラスを追加

* Dressca.UnitTestsのLoggerを使うテストクラスでTestBaseを継承するよう変更

* ConsoleAppWithDIの結合テストプロジェクトにテストのベースクラスを追加

* TestBaseを使うようにConsoleAppWithDIの結合テストを修正

* ConsoleAppWithDIの単体テストプロジェクトにテストのベースクラスを追加

* TestBaseを使うようにConsoleAppWithDIの単体テストを修正

* カタログアイテムが見つからないときのログレベルを情報に変更

* 情報ログの出力を確認する単体テストを追加

* LiveUnitTestingの設定ファイルを除外設定に追加

* テストコードの実装パターンで抵触する情報レベルのエラー通知を無効化

* Dressca.UnitTestsのテストメソッド名でテスト仕様を表現するように修正

* コンストラクターの必要なテストクラスでプライマリーコンストラクターを利用するよう修正

* 不要なusingを削除

* Dressca.UnitTestsのコレクション検証処理で要素数が1のものを検証する場合Assert.Singleを利用するように修正

* Dressca.UnitTestsの配列、リスト初期化処理を簡易構文に修正

* Dressca.UnitTestsで要素数が0の検証をCountプロパティで実施するよう変更

* nullを許容する箇所でNull許容参照型を利用するように修正

* オブジェクト初期化の簡易構文を利用するよう修正

* プライマリーコンストラクターを使用するように修正

* テストメソッド名にテスト仕様を含めるように修正

* defaultの短縮構文を利用するように修正

* テストメソッド名にテスト仕様を含めるよう修正

* MemberDataAttributeの対象データにTheoryDataを利用するよう修正

* 不要なusingを削除

* .gitignoreに*.lutconfigを追加

* IDE0039をテストコードでは無視するよう設定

* テストメソッドの名前でテスト仕様を表現するように修正

* Arrangeの漏れを修正

* 型の誤りを修正

* 単一要素のコレクションの検証にAssert.Singleを使うよう修正

* 配列の初期化処理で短縮構文を利用するよう修正

* 単一要素のコレクションの検証にAssert.Singleを利用するよう修正

* 配列の初期化処理で短縮構文を利用するように修正

* コンストラクターの呼び出しで短縮構文を利用するように修正

* MemberDataのデータソースにTheoryDataを利用するよう修正

* プライマリーコンストラクターを利用するように修正

* テストコードでのSA1602の警告を無効化

* プライマリーコンストラクターを利用するように修正

* リストの初期化処理で短縮構文を利用するように修正

* 不要なコンストラクターを削除
  • Loading branch information
tsuna-can-se authored Feb 8, 2024
1 parent 13e34cd commit f59b0e2
Show file tree
Hide file tree
Showing 59 changed files with 485 additions and 468 deletions.
1 change: 1 addition & 0 deletions samples/ConsoleAppWithDI/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
*.user
*.userosscache
*.sln.docstates
*.lutconfig

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
Expand Down
2 changes: 2 additions & 0 deletions samples/ConsoleAppWithDI/solution/tests/.editorconfig
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
[*.cs]
# Wrapping preferences
dotnet_diagnostic.IDE0039.severity=none
dotnet_diagnostic.SA0001.severity=none
dotnet_diagnostic.SA1123.severity=none
dotnet_diagnostic.SA1600.severity=none
dotnet_diagnostic.SA1602.severity=none
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,11 @@

namespace Maris.ConsoleApp.IntegrationTests.ScopeTests.Commands;

internal class Command : SyncCommand<Parameter>
internal class Command(TestObject1 obj1, TestObject2 obj2) : SyncCommand<Parameter>
{
internal const string CommandName = "scope-test";
private readonly TestObject1 obj1;
private readonly TestObject2 obj2;

public Command(TestObject1 obj1, TestObject2 obj2)
{
this.obj1 = obj1;
this.obj2 = obj2;
}
private readonly TestObject1 obj1 = obj1;
private readonly TestObject2 obj2 = obj2;

protected override ICommandResult Execute(Parameter parameter)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

internal static class ObjectStateHistory
{
private static readonly List<ObjectState> HistoryStore = new();
private static readonly List<ObjectState> HistoryStore = [];

internal static IReadOnlyCollection<ObjectState> Histories => HistoryStore.AsReadOnly();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
using Maris.ConsoleApp.Hosting;
using Maris.ConsoleApp.IntegrationTests.ScopeTests.Commands;
using Maris.Logging.Testing.Xunit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Xunit.Abstractions;

namespace Maris.ConsoleApp.IntegrationTests.ScopeTests;

[Collection(nameof(ScopeTests))]
public class ScopedTest
public class ScopedTest(ITestOutputHelper testOutputHelper) : TestBase(testOutputHelper)
{
private readonly TestLoggerManager loggerManager;

public ScopedTest(ITestOutputHelper testOutputHelper)
=> this.loggerManager = new TestLoggerManager(testOutputHelper);

[Fact]
public async Task Scopedで登録したインスタンスはコマンド実行時に1回だけ初期化される()
{
Expand Down Expand Up @@ -127,7 +121,7 @@ private IHost CreateHost()
var builder = Host.CreateDefaultBuilder(args);
builder.ConfigureServices((context, services) =>
{
services.AddTestLogging(this.loggerManager);
services.AddTestLogging(this.LoggerManager);
services.AddScoped<TestObject1>(); // Command 内で利用
services.AddScoped<TestObject2>(); // Command, TestObject1 内で利用
services.AddConsoleAppService(args);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
using Maris.ConsoleApp.Hosting;
using Maris.ConsoleApp.IntegrationTests.ScopeTests.Commands;
using Maris.Logging.Testing.Xunit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Xunit.Abstractions;

namespace Maris.ConsoleApp.IntegrationTests.ScopeTests;

[Collection(nameof(ScopeTests))]
public class SingletonTest
public class SingletonTest(ITestOutputHelper testOutputHelper) : TestBase(testOutputHelper)
{
private readonly TestLoggerManager loggerManager;

public SingletonTest(ITestOutputHelper testOutputHelper)
=> this.loggerManager = new TestLoggerManager(testOutputHelper);

[Fact]
public async Task Singletonで登録したインスタンスはコマンド実行時に1回だけ初期化される()
{
Expand Down Expand Up @@ -127,7 +121,7 @@ private IHost CreateHost()
var builder = Host.CreateDefaultBuilder(args);
builder.ConfigureServices((context, services) =>
{
services.AddTestLogging(this.loggerManager);
services.AddTestLogging(this.LoggerManager);
services.AddSingleton<TestObject1>(); // Command 内で利用
services.AddSingleton<TestObject2>(); // Command, TestObject1 内で利用
services.AddConsoleAppService(args);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
namespace Maris.ConsoleApp.IntegrationTests.ScopeTests;

internal class TestObject1 : TestObjectBase
internal class TestObject1(TestObject2 obj2) : TestObjectBase
{
private readonly TestObject2 obj2;

public TestObject1(TestObject2 obj2) => this.obj2 = obj2;
private readonly TestObject2 obj2 = obj2;

internal void DoSomething()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,5 @@

internal class TestObject2 : TestObjectBase
{
public TestObject2()
{
}

internal void DoSomething() => this.LogHistory();
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
using Maris.ConsoleApp.Hosting;
using Maris.ConsoleApp.IntegrationTests.ScopeTests.Commands;
using Maris.Logging.Testing.Xunit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Xunit.Abstractions;

namespace Maris.ConsoleApp.IntegrationTests.ScopeTests;

[Collection(nameof(ScopeTests))]
public class TransientTest
public class TransientTest(ITestOutputHelper testOutputHelper) : TestBase(testOutputHelper)
{
private readonly TestLoggerManager loggerManager;

public TransientTest(ITestOutputHelper testOutputHelper)
=> this.loggerManager = new TestLoggerManager(testOutputHelper);

[Fact]
public async Task Transientで登録したインスタンスはインジェクション時に毎回初期化される()
{
Expand Down Expand Up @@ -130,7 +124,7 @@ private IHost CreateHost()
var builder = Host.CreateDefaultBuilder(args);
builder.ConfigureServices((context, services) =>
{
services.AddTestLogging(this.loggerManager);
services.AddTestLogging(this.LoggerManager);
services.AddTransient<TestObject1>(); // Command 内で利用
services.AddTransient<TestObject2>(); // Command, TestObject1 内で利用
services.AddConsoleAppService(args);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using Maris.Logging.Testing.Xunit;
using Xunit.Abstractions;

namespace Maris.ConsoleApp.IntegrationTests;

public class TestBase
{
protected TestBase(ITestOutputHelper testOutputHelper)
{
ArgumentNullException.ThrowIfNull(testOutputHelper);
this.LoggerManager = new TestLoggerManager(testOutputHelper);
}

protected TestLoggerManager LoggerManager { get; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public void Parameter_ConsoleAppContextに設定したパラメーターを取
}

[Fact]
public void ValidateAllParameterを呼び出すとValidateParameterメソッドが指定したパラメーターを伴って呼び出される()
public void ValidateAllParameter_ValidateParameterメソッドがコンテキストに指定したパラメーターを伴って1回呼び出される()
{
// Arrange
var parameter = new CommandParameter();
Expand All @@ -44,7 +44,7 @@ public void ValidateAllParameterを呼び出すとValidateParameterメソッド
}

[Fact]
public void IAsyncCommandのExecuteAsyncを呼び出すとExecuteAsyncメソッドが指定したパラメーターとキャンセルトークンを伴って呼び出される()
public void IAsyncCommandのExecuteAsync_ExecuteAsyncメソッドがコンテキストに指定したパラメーターとキャンセルトークンを伴って1回呼び出される()
{
// Arrange
var parameter = new CommandParameter();
Expand All @@ -64,10 +64,10 @@ public void IAsyncCommandのExecuteAsyncを呼び出すとExecuteAsyncメソッ
}

[Fact]
public void パラメーターの型にインターフェースを使用できる()
public void Initialize_パラメーターの型にインターフェースを使用できる()
{
// Arrange
var parameter = new ParameterWithInterface();
IParameter parameter = new ParameterWithInterface();
var commandAttribute = new CommandAttribute("dummy-command", typeof(CommandWithInterface));
var context = new ConsoleAppContext(commandAttribute, parameter);
var commandMock = new Mock<CommandWithInterface>();
Expand All @@ -78,7 +78,7 @@ public void パラメーターの型にインターフェースを使用でき
}

[Fact]
public void パラメーターの型とコンテキストのパラメーター型が一致しない場合は例外()
public void Initialize_パラメーターの型とコンテキストのパラメーター型が一致しない_InvalidOperationExceptionが発生する()
{
// Arrange
var parameter = new ParameterWithInterface();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Maris.ConsoleApp.UnitTests.Core;
public class CommandAttributeTest
{
[Fact]
public void Constructor_コマンドの型がnullの場合は例外()
public void Constructor_コマンドの型がnull_ArgumentNullExceptionが発生する()
{
// Arrange
string name = "command";
Expand All @@ -19,7 +19,7 @@ public void Constructor_コマンドの型がnullの場合は例外()
}

[Fact]
public void Constructor_コマンドの型がコマンドの定義を満たしていない場合は例外()
public void Constructor_コマンドの型がコマンドの定義を満たしていない_ArgumentExceptionが発生する()
{
// Arrange
string name = "command";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public void CommandName_初期化時に指定したコマンド名を取得で
}

[Fact]
public void Context_初期値のまま取得すると例外()
public void Context_初期値のまま取得する_InvalidOperationExceptionが発生する()
{
// Arrange
var command = new CommandImpl();
Expand Down Expand Up @@ -68,7 +68,7 @@ public void Context_初期化時に指定したコンテキストを取得でき
}

[Fact]
public void Initialize_nullで初期化すると例外()
public void Initialize_nullで初期化する_ArgumentNullExceptionが発生する()
{
// Arrange
var command = new CommandImpl();
Expand All @@ -82,27 +82,29 @@ public void Initialize_nullで初期化すると例外()
}

[Fact]
public void ValidateAllParameter_入力パラメータのクラスにプロパティが定義されていない()
public void ValidateAllParameter_入力パラメータのクラスにプロパティが定義されていない_例外が発生しない()
{
// Arrange
var command = new CommandImpl();
string commandName = "dummy-command";
var commandAttribute = new CommandAttribute(commandName, typeof(CommandImpl));
var context = new ConsoleAppContext(commandAttribute, new object());
var parameter = new object();
var context = new ConsoleAppContext(commandAttribute, parameter);
command.Initialize(context);

// Act and Assert(例外が発生しないこと)
command.ValidateAllParameter();
}

[Fact]
public void ValidateAllParameter_入力パラメータのクラスにプロパティがあるが検証属性が定義されていない()
public void ValidateAllParameter_入力パラメータのクラスにプロパティがあるが検証属性が定義されていない_例外が発生しない()
{
// Arrange
var command = new CommandImpl();
string commandName = "dummy-command";
var commandAttribute = new CommandAttribute(commandName, typeof(CommandImpl));
var context = new ConsoleAppContext(commandAttribute, new NoDataAnnotationParameter());
var parameter = new NoDataAnnotationParameter();
var context = new ConsoleAppContext(commandAttribute, parameter);
command.Initialize(context);

// Act and Assert(例外が発生しないこと)
Expand All @@ -112,7 +114,7 @@ public void ValidateAllParameter_入力パラメータのクラスにプロパ
[Theory]
[InlineData("", 0)]
[InlineData("1234567890", 5)]
public void ValidateAllParameter_入力パラメータのクラスに検証属性を定義したプロパティがあり検証に成功する値が設定されている(string param1, int param2)
public void ValidateAllParameter_入力パラメータのクラスに検証属性を定義したプロパティがあり検証に成功する値が設定されている_例外が発生しない(string param1, int param2)
{
// Arrange
var command = new CommandImpl();
Expand All @@ -131,7 +133,7 @@ public void ValidateAllParameter_入力パラメータのクラスに検証属
}

[Fact]
public void ValidateAllParameter_入力パラメータのクラスに検証属性を定義したプロパティがあり一部検証に失敗する値が設定されている()
public void ValidateAllParameter_入力パラメータのクラスに検証属性を定義したプロパティがあり一部検証に失敗する値が設定されている_検証失敗メッセージを伴うInvalidParameterExceptionが発生する()
{
// Arrange
var command = new CommandImpl();
Expand All @@ -153,13 +155,11 @@ public void ValidateAllParameter_入力パラメータのクラスに検証属

// Assert
var ex = Assert.Throws<InvalidParameterException>(action);
Assert.Collection(
ex.ValidationResults,
result => Assert.Equal("Param2 は 0 から 5 の間で設定してください。", result.ErrorMessage));
Assert.Single(ex.ValidationResults, result => result.ErrorMessage == "Param2 は 0 から 5 の間で設定してください。");
}

[Fact]
public void ValidateAllParameter_入力パラメータのクラスに検証属性を定義したプロパティがあり複数検証に失敗する値が設定されている()
public void ValidateAllParameter_入力パラメータのクラスに検証属性を定義したプロパティがあり複数検証に失敗する値が設定されている_検証失敗メッセージを伴うInvalidParameterExceptionが発生する()
{
// Arrange
var command = new CommandImpl();
Expand Down Expand Up @@ -188,7 +188,7 @@ public void ValidateAllParameter_入力パラメータのクラスに検証属
}

[Fact]
public void ValidateAllParameter_コマンドクラスのロジック内でパラメーターの入力値検証エラーがあった()
public void ValidateAllParameter_コマンドクラスのロジック内でパラメーターの入力値検証エラーがあった_InvalidParameterExceptionが発生する()
{
// Arrange
var command = new ValidationErrorCommand();
Expand Down
Loading

0 comments on commit f59b0e2

Please sign in to comment.