C# 通过点击数据库测试实体框架数据

C# 通过点击数据库测试实体框架数据,c#,asp.net,unit-testing,entity-framework,tdd,C#,Asp.net,Unit Testing,Entity Framework,Tdd,我试图通过实际访问数据库来测试我的真实数据。我实际上是在测试我的存储库类。这是我正在做的一个例子 /// <summary> /// Summary description for Country /// </summary> [TestClass] public class Country { public Country() { _countryRepo = new CountryRepository(); } privat

我试图通过实际访问数据库来测试我的真实数据。我实际上是在测试我的存储库类。这是我正在做的一个例子

/// <summary>
/// Summary description for Country
/// </summary>
[TestClass]
public class Country {

    public Country() {
        _countryRepo = new CountryRepository();
    }

    private ICountryRepository _countryRepo;

    [TestMethod]
    public void db_should_return_at_least_one_country_as_approved_all() {

        //Act
        var model = _countryRepo.GetAll();

        //Assert
        Assert.IsTrue(model.Count() >= 1);
    }

    [TestMethod]
    public void db_should_return_at_least_one_country_as_approved_true() { 

        //Act
        var model = _countryRepo.GetAll(ApprovalStatus.Approved);

        //Assert
        Assert.IsTrue(model.Count() >= 1);
    }

    [TestMethod]
    public void db_should_return_Turkey_as_country_name_by_id() {

        //Act
        var model = _countryRepo.GetSingle(1000);

        //Assert
        Assert.AreEqual<string>("Turkey", model.CountryName);

    }

    [TestMethod]
    public void db_should_return_Turkey_as_country_name_by_countryISO3166Code() {

        //Act
        var model = _countryRepo.GetSingle("TR");

        //Assert
        Assert.AreEqual<string>("Turkey", model.CountryName);

    }

    [TestMethod]
    public void db_should_return_Turkey_as_country_name_by_GUID() {

        //Act
        var model = _countryRepo.GetSingle(Guid.Parse("9AF174A6-D0F7-4393-AAAD-B168BADEDB30"));

        //Assert
        Assert.AreEqual<string>("Turkey", model.CountryName);

    }

}
//
///国家/地区的简要说明
/// 
[测试类]
公营国家{
公共国家(){
_countryRepo=新CountryRepository();
}
私人IContyrepository\u countryRepo;
[测试方法]
公共无效数据库应返回至少一个国家(经批准){
//表演
var模型=_countryRepo.GetAll();
//断言
Assert.IsTrue(model.Count()>=1);
}
[测试方法]
public void db应返回至少一个经批准的国家
//表演
var模型=\u countryRepo.GetAll(ApprovalStatus.Approved);
//断言
Assert.IsTrue(model.Count()>=1);
}
[测试方法]
public void db_应_返回_Turkey_作为_country_name_by_id(){
//表演
var模型=_countryRepo.GetSingle(1000);
//断言
Assert.AreEqual(“土耳其”,型号.CountryName);
}
[测试方法]
public void db_应_countryISO3166Code()将_Turkey_返回为_country_name_{
//表演
风险值模型=_countryRepo.GetSingle(“TR”);
//断言
Assert.AreEqual(“土耳其”,型号.CountryName);
}
[测试方法]
public void db_应_返回_Turkey_作为_country_name_by_GUID(){
//表演
风险值模型=_countryRepo.GetSingle(Guid.Parse(“9AF174A6-D0F7-4393-AAAD-B168BADEDB30”);
//断言
Assert.AreEqual(“土耳其”,型号.CountryName);
}
}

这很适合我的需要,但我想知道我是否按规定做对了。这里有没有其他我应该遵循的模式。我不想伪造我的数据,我真正的任务是测试我的DAL和真实的生产数据。

如果其他人(甚至你)访问你的数据库并创建新的批准国家或更改你的国家名称,你的测试将失败。您可能会想:“我的存储库有问题,为什么它不能按预期工作?”但是,是的,问题不在于存储库


当我编写命中数据库的测试时,我喜欢在启动时创建DB并加载默认值,然后立即销毁。我不确定这是否是最好的选择,但效果相当不错。这种方法的问题是速度较慢,需要编写更多的代码。

对于手头的需求,即真正静态的数据,不应篡改,我认为这是一种有效的方法


但是,我建议您编写测试用例,而不是针对每个国家重复相同的测试用例。

您应该使用静态数据库进行测试,并且您的测试方法应根据实际预期计数进行断言。如果您只声明它返回了至少一条记录,您如何知道它确实返回了您期望的内容?您甚至应该检查结果集并测试所有记录是否满足条件(但它通常用于更复杂的条件)。

是的,您是对的,如果其他人转到表并将国家名称Turkey更改为其他名称,则该结果将中断。但我的重点是测试我的EF代码是否正常工作。那么,您建议将所有值加载到变量中,然后稍后再使用它们?它会带来什么不同?不是变量。我在启动时运行SQL,创建数据库和数据。然后,运行测试,它将检查存储库是否返回预期值。我确信数据会在那里,并且我知道预期会发生什么,因为我已经在SQL上写过了(那是在测试代码中)。不同之处在于,您不太依赖于数据库的当前状态。如果某些测试更改了行的状态,则需要回滚它,因为下次运行它时,测试可能会失败。好的。所以复制数据库并在本地运行它也可以处理假数据,对吗?