← スキル一覧に戻る

test-generator
by ademceper
⭐ 1🍴 0📅 2026年1月23日
SKILL.md
name: test-generator description: Generates comprehensive unit and integration tests using xUnit, FluentAssertions, and NSubstitute
Test Generator Skill
Bu skill, Merge E-Commerce Backend projesi için test dosyaları oluşturur.
Ne Zaman Kullan
- "Test yaz", "unit test oluştur" dendiğinde
- Bir handler/service için test istendiğinde
- "Bu kodu test et" gibi isteklerde
Test Türleri
1. Unit Test (Handler)
Merge.Tests/Unit/Application/{Module}/Commands/
└── {Name}CommandHandlerTests.cs
public class {Name}CommandHandlerTests
{
private readonly IRepository<{Entity}> _repository;
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;
private readonly ILogger<{Name}CommandHandler> _logger;
private readonly {Name}CommandHandler _sut;
public {Name}CommandHandlerTests()
{
_repository = Substitute.For<IRepository<{Entity}>>();
_unitOfWork = Substitute.For<IUnitOfWork>();
_mapper = Substitute.For<IMapper>();
_logger = Substitute.For<ILogger<{Name}CommandHandler>>();
_sut = new {Name}CommandHandler(
_repository,
_unitOfWork,
_mapper,
_logger);
}
[Fact]
public async Task Handle_ValidCommand_Returns{Result}()
{
// Arrange
var command = new {Name}Command(/* valid data */);
var entity = {Entity}.Create(/* data */);
var expectedDto = new {Entity}Dto { /* data */ };
_repository.AddAsync(Arg.Any<{Entity}>(), Arg.Any<CancellationToken>())
.Returns(Task.CompletedTask);
_unitOfWork.SaveChangesAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult(1));
_mapper.Map<{Entity}Dto>(Arg.Any<{Entity}>())
.Returns(expectedDto);
// Act
var result = await _sut.Handle(command, CancellationToken.None);
// Assert
result.Should().NotBeNull();
result.Should().BeEquivalentTo(expectedDto);
await _repository.Received(1).AddAsync(
Arg.Any<{Entity}>(),
Arg.Any<CancellationToken>());
await _unitOfWork.Received(1).SaveChangesAsync(
Arg.Any<CancellationToken>());
}
[Fact]
public async Task Handle_InvalidCommand_ThrowsValidationException()
{
// Arrange
var command = new {Name}Command(/* invalid data */);
// Act
var act = () => _sut.Handle(command, CancellationToken.None);
// Assert
await act.Should().ThrowAsync<ValidationException>();
}
}
2. Unit Test (Entity)
public class {Entity}Tests
{
[Fact]
public void Create_ValidData_ReturnsEntity()
{
// Arrange
var name = "Test Name";
// Act
var entity = {Entity}.Create(name);
// Assert
entity.Should().NotBeNull();
entity.Id.Should().NotBeEmpty();
entity.Name.Should().Be(name);
entity.DomainEvents.Should().ContainSingle()
.Which.Should().BeOfType<{Entity}CreatedEvent>();
}
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void Create_InvalidName_ThrowsArgumentException(string? name)
{
// Act
var act = () => {Entity}.Create(name!);
// Assert
act.Should().Throw<ArgumentException>();
}
}
3. Integration Test
public class {Entity}sControllerTests : IClassFixture<CustomWebApplicationFactory>
{
private readonly HttpClient _client;
private readonly CustomWebApplicationFactory _factory;
public {Entity}sControllerTests(CustomWebApplicationFactory factory)
{
_factory = factory;
_client = factory.CreateClient();
}
[Fact]
public async Task GetAll_ReturnsPagedResult()
{
// Act
var response = await _client.GetAsync("/api/v1/{entities}");
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
var content = await response.Content.ReadFromJsonAsync<PagedResult<{Entity}Dto>>();
content.Should().NotBeNull();
content!.Items.Should().NotBeEmpty();
}
[Fact]
public async Task Create_ValidRequest_ReturnsCreated()
{
// Arrange
var request = new Create{Entity}Command(/* data */);
// Act
var response = await _client.PostAsJsonAsync("/api/v1/{entities}", request);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.Created);
response.Headers.Location.Should().NotBeNull();
}
}
Test Naming Convention
{Method}_{Scenario}_{ExpectedResult}
Örnekler:
Create_ValidData_ReturnsEntityHandle_ProductNotFound_ThrowsNotFoundExceptionUpdate_ConcurrentModification_ThrowsConflictException
Kurallar
- AAA pattern (Arrange-Act-Assert)
- NSubstitute for mocking
- FluentAssertions for assertions
- Her public method için en az 2 test (happy + sad path)
- Theory ile parameterized tests
スコア
総合スコア
40/100
リポジトリの品質指標に基づく評価
✓SKILL.md
SKILL.mdファイルが含まれている
+20
○LICENSE
ライセンスが設定されている
0/10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
○最近の活動
3ヶ月以内に更新がある
0/10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
○タグ
1つ以上のタグが設定されている
0/5
レビュー
💬
レビュー機能は近日公開予定です