C# 单元测试创建带有索引的表的方法

C# 单元测试创建带有索引的表的方法,c#,sql,unit-testing,nunit,C#,Sql,Unit Testing,Nunit,我为测试创建了这个假的db,但我不知道如何从这里继续。我知道我需要创建具有收益率回报的预期情景,并将结果与预期结果进行比较等等,但我不知道如何开始,我只需要一个起点。这对我来说都是新鲜事,所以如果这是一个愚蠢的问题,请大家道歉 公共类索引扩展:DataAccessFixture { [测试] public void CreateTableWithIndex() { var db=this.database.Create(); var表=db.可定义(“可索引”); table.Columns.A

我为测试创建了这个假的db,但我不知道如何从这里继续。我知道我需要创建具有收益率回报的预期情景,并将结果与预期结果进行比较等等,但我不知道如何开始,我只需要一个起点。这对我来说都是新鲜事,所以如果这是一个愚蠢的问题,请大家道歉

公共类索引扩展:DataAccessFixture
{
[测试]
public void CreateTableWithIndex()
{
var db=this.database.Create();
var表=db.可定义(“可索引”);
table.Columns.Add(“Id”,FieldType.Guid,false,true);
table.Columns.Add(“CustomerNumber”,FieldType.VarChar,50);
表.Columns.Add(“Name”,FieldType.VarChar,50);
表.索引.添加(“IX_名称”,假,“名称”);
表.索引.添加(“IX_CustomerNumber”,真,“CustomerNumber”);
db.Execute();
this.database.DropTable(table.Name);
}
}

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

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

由于不清楚您使用的是自定义类型还是bcl类型,我将继续假设您正在测试自定义类型。 如果
数据库
数据库
表格
实际上是bcl类型,则不再阅读。 测试这些类没有意义。 也就是说,
db.Execute()
到底做了什么

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

[测试]
public void DefineTableDoesNotThrow(){
//安排
var database=//在此处创建实例
var db=database.Create();
var表=null;
//行动与主张
Assert.DoesNotThrow(()=>table=db.DefineTable(“IndexedTable”);
//清理
DropTable(“IndexedTable”);
}
[测试]
公共无效可定义(){
//安排
var database=//在此处创建实例
var db=database.Create();
//表演
var表=db.可定义(“可索引”);
//断言
//检查您的表是否已创建并存在。
//不要在意这里的实际列。
//清理
DropTable(“IndexedTable”);
}
接下来,您要测试您的列是否按照您希望的方式创建。 这是另一个功能,因此它应该是另一个测试。 它的工作原理就像
DefineTable
一样,首先要确保它不会抛出异常,然后再担心它是否正常工作

[测试]
public void column adddoesnotthrow(){
//安排
var database=//在此处创建实例
var db=database.Create();
var表=db.可定义(“可索引”);
//行动与主张
Assert.DoesNotThrow(()=>table.Columns.Add(“Id”,FieldType.Guid,false,true));
//清理
DropTable(“IndexedTable”);
}
[测试]
公共空列添加(){
//安排
var database=//在此处创建实例
var db=database.Create();
var表=db.可定义(“可索引”);
//表演
table.Columns.Add(“Id”,FieldType.Guid,false,true);
//断言
//检查您的表现在是否有正确的列
//清理
DropTable(“IndexedTable”);
}
下一个最好的方法是让最后一个测试使用多个输入。 这允许您只需添加另一行代码,就可以使用相同的代码测试边缘情况。 使用
[TestCaseAttribute(…)]
装饰测试,并将所需参数添加到测试方法中。 必须对
table.Column.Add(…)
的每一个可能的重载执行此操作。
不用说,这同样适用于
table.indexs.Add(…)

那么下一步是检查是否实际创建了表?登录到数据库并检查我认为单元测试这段代码没有什么意义。你希望你的测试能达到什么目的?您需要测试的是核心数据库类是否工作,这些类已经有了单元测试。如果您坚持单元测试,那么您需要概述您的测试到底是为了什么,您的场景是什么,有效测试和无效测试是什么样子的