单元测试创​​建带有索引的 table 的方法

Unit Testing a method that creates a table with indexes

我为测试创建了这个假数据库,但我不知道如何从这里继续。我知道我需要使用 yield return 创建预期场景并将结果与​​预期结果进行比较等等,但我不知道如何开始,我只需要一个起点。这对我来说是全新的,所以如果这是一个愚蠢的问题,请大家道歉。

public class IndexTests : DataAccessFixture
{
    [Test]
    public void CreateTableWithIndex()
    {
        var db = this.database.Create();
        var table = db.DefineTable("IndexedTable");

        table.Columns.Add("Id", FieldType.Guid, false, true);
        table.Columns.Add("CustomerNumber", FieldType.VarChar, 50);
        table.Columns.Add("Name", FieldType.VarChar, 50);

        table.Indices.Add("IX_Name", false, "Name");
        table.Indices.Add("IX_CustomerNumber", true, "CustomerNumber");

        db.Execute();

        this.database.DropTable(table.Name);
    }
}

首先,您应该避免在测试 class 中使用 database 字段。 这可能会干扰可能 运行 同时使用同一对象的其他测试,这可能会或可能不会混淆您的结果(但可能会)。

哪个是你的假数据库? 字段 database 还是来自 database.Create() 的结果? 如果是后者,那么您的测试实际上只是在测试您的假代码,而不是您的产品代码。

由于不清楚您使用的是 自定义类型 还是 bcl 类型 我将继续并假设您是测试您的自定义类型。 如果 databasedbtable 实际上是 bcl 类型 ,则无需进一步阅读。 测试那些 classes 没有意义。 也就是说,db.Execute() 到底是做什么的?

您目前正在同时测试多项内容,这应该避免。 从创建 table 的测试开始并检查它是否存在。 您还需要一个确保没有异常抛出的测试。

[Test]
public void DefineTableDoesNotThrow() {

    // arrange
    var database = // create your instance here
    var db = database.Create();
    var table = null;

    // act & assert
    Assert.DoesNotThrow(() => table = db.DefineTable("IndexedTable"));

    // clean up
    database.DropTable("IndexedTable");

}
[Test]
public void DefineTable() {

    // arrange
    var database = // create your instance here
    var db = database.Create();

    // act
    var table = db.DefineTable("IndexedTable");

    // assert
    // check if your table was created and exists.
    // do not care about the actual columns in here.

    // clean up
    database.DropTable("IndexedTable");

}

接下来您要测试您的列是否按照您想要的方式创建。 这是另一个功能,所以它应该是另一个测试。 它的工作方式就像 DefineTable 一样,您首先要确保它不会抛出异常,然后再担心它是否正常工作。

[Test]
public void ColumnAddDoesNotThrow() {

    // arrange
    var database = // create your instance here
    var db = database.Create();
    var table = db.DefineTable("IndexedTable");

    // act & assert
    Assert.DoesNotThrow(() => table.Columns.Add("Id", FieldType.Guid, false, true));

    // clean up
    database.DropTable("IndexedTable");

}
[Test]
public void ColumnAdd() {

    // arrange
    var database = // create your instance here
    var db = database.Create();
    var table = db.DefineTable("IndexedTable");

    // act
    table.Columns.Add("Id", FieldType.Guid, false, true);

    // assert
    // check if your table now has the correct column

    // cleanup
    database.DropTable("IndexedTable");

}

下一个最好的办法是让最后一个测试使用多个输入。 这允许您通过添加另一行代码来使用相同的代码测试边缘情况。 用 [TestCaseAttribute(...)] 装饰测试,并将所需的参数添加到您的测试方法中。 对于每个可能的 table.Column.Add(...) 过载都必须这样做。 不用说,这也适用于 table.Indices.Add(...)