AWS CreateBatchWrite 单元测试

AWS CreateBatchWrite unit test

我正在尝试围绕 AWS DynamoDb C# 库 CreateBatchWrite 编写一些单元测试。

这是方法:

public void BatchSave<T>(string tableName, List<T> items)
{
    if (string.IsNullOrWhiteSpace(tableName))
    {
        throw new ArgumentNullException(nameof(tableName));
    }

    if (items == null)
    {
        throw new ArgumentNullException(nameof(items));
    }

    items.RemoveAll(x => x == null);

    BatchWrite<T> batch = _dynamoDbContext.CreateBatchWrite<T>(
        new DynamoDBOperationConfig()
        {
            OverrideTableName = tableName
        });

    batch.AddPutItems(items);
    batch.Execute();
}

我的问题是来自 CreateBatchWrite 的 return 对象:BatchWrite 是强类型 class。

除了将我的先决条件移到下一层或上一层之外,还有什么方法可以对此进行单元测试吗?我的做法正确吗?

如果您只想测试先决条件,则创建被测 class 的实例,传递将导致预期行为的参数并断言它按预期发生。

如果测试不需要完成,则甚至不需要模拟依赖项。

例如

[TestClass]
public class AwsTests {
    [Test]
    public void Should_Throw_For_Null_TableName() {
        //Arrange
        var subject = new SubjectUnderTest(null);
        ArgumentNullException exception = null;
        var expected = "tableName";

        //Act
        try {
            subject.BatchSave<object>(null, null);
        } catch (ArgumentNullException e) {
            exception = e;
        }

        //Assert
        exception.Should().NotBeNull();
        exception.ParamName.Should().Be(expected);
    }

    [Test]
    public void Should_Throw_For_Null_Items() {
        //Arrange
        var subject = new SubjectUnderTest(null);
        ArgumentNullException exception = null;
        var expected = "items";

        //Act
        try {
            subject.BatchSave<object>("fakeTableName", null);
        } catch (ArgumentNullException e) {
            exception = e;
        }

        //Assert
        exception.Should().NotBeNull();
        exception.ParamName.Should().Be(expected);
    }
}

以上测试方法的两个 if 条件作为隔离单元测试,仅提供安全执行测试所必需的条件。