单元测试创建带有索引的 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 类型 我将继续并假设您是测试您的自定义类型。
如果 database
、db
和 table
实际上是 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(...)
。
我为测试创建了这个假数据库,但我不知道如何从这里继续。我知道我需要使用 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 类型 我将继续并假设您是测试您的自定义类型。
如果 database
、db
和 table
实际上是 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(...)
。