我想测试使用Entity Framework构建的实体.我担心的是使用实体框架意味着直接使用数据源.那么任何想法如何单元测试基于Entity Framework的组件?
我是针对ADO .NET实体框架编写的单元测试代码.我想用行填充内存数据库,并确保我的代码正确检索它们.
我可以使用Rhino Mocks来模拟实体框架,但这还不够.我会告诉查询返回给我的实体.这既不会测试where子句,也不会测试.Include()语句.我想确保我的where子句只匹配我想要的行,而不是其他行.我想确定我已经要求我需要的实体,而不是我没有.
例如:
class CustomerService
{
ObjectQuery<Customer> _customerSource;
public CustomerService(ObjectQuery<Customer> customerSource)
{
_customerSource = customerSource;
}
public Customer GetCustomerById(int customerId)
{
var customers = from c in _customerSource.Include("Order")
where c.CustomerID == customerId
select c;
return customers.FirstOrDefault();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我模拟ObjectQuery以返回一个填充了订单的已知客户,我怎么知道CustomerService有正确的where子句和Include?我宁愿插入一些客户行和一些订单行,然后断言选择了正确的客户并填充了订单.
我想在Visual Studio中使用单元测试来测试我的C#代码.代码与MySQL数据库交互.
我要测试的一个示例
用户打开我的应用程序,并通过Web服务保存在数据库中.现在我想知道Users在新用户来之前表是否还有一行.但是,如果我在webservice中测试该方法,这将在数据库中创建一条记录,那么测试数据将在数据库中.我不想在我的数据库中测试数据.
有这个问题的解决方案吗?
我是Unit Tests的新手,所以我一直在尝试编写一些示例来学习使用它们的正确方法.我有一个示例项目,它使用Entity Framework连接到数据库.
我正在使用由数据访问层组成的n层体系结构,该数据访问层使用EF查询数据库,业务层调用数据访问层方法来查询数据库并使用检索到的数据执行其业务目的以及组成的服务层简单地调用业务层对象的WCF服务.
我是否必须为每一层(数据访问,业务层,服务层?)编写单元测试?
哪种方法可以为查询数据库的方法编写单元测试代码?下一个代码是我的数据访问层中的一个方法的例子,它对数据库执行选择,它的单元测试应该如何?
public class DLEmployee
{
private string _strErrorMessage = string.Empty;
private bool _blnResult = true;
public string strErrorMessage
{
get
{
return _strErrorMessage;
}
}
public bool blnResult
{
get
{
return _blnResult;
}
}
public Employee GetEmployee(int pintId)
{
Employee employee = null;
_blnResult = true;
_strErrorMessage = string.Empty;
try
{
using (var context = new AdventureWorks2012Entities())
{
employee = context.Employees.Where(e => e.BusinessEntityID == pintId).FirstOrDefault();
}
}
catch (Exception ex)
{
_strErrorMessage = ex.Message; …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有多个小实体框架dbcontexts,它们共享同一个数据库,例如:
public class Context1 : DbContext {
public Context1()
: base("DemoDb") {
}
}
public class Context2 : DbContext {
public Context2()
: base("DemoDb") {
}
}
Run Code Online (Sandbox Code Playgroud)
所有数据库更新都是通过脚本完成的,不依赖于迁移(它们也不会继续).问题是 - 你将如何针对这些背景进行集成测试?
我相信这里有三种选择(可能还有更多我不知道)
选项1 - 超级上下文 - 包含设置数据库所需的所有模型和配置的上下文:
public class SuperContext : DbContext
{
public SuperContext()
: base("DemoDb") {
}
}
Run Code Online (Sandbox Code Playgroud)
在此选项中,将针对超级上下文设置测试数据库,并且所有后续测试将通过较小的上下文完成.我不喜欢这个选项的原因是我将复制我已经构建的所有配置和实体模型.
选项2 - 为集成测试创建自定义初始化程序,该集成测试将运行所有相应的db初始化脚本:
public class IntegrationTestInitializer : IDatabaseInitializer<DbContext> {
public void InitializeDatabase(DbContext context) {
/* run scripts to set up database here */
}
}
Run Code Online (Sandbox Code Playgroud)
此选项允许针对真实的数据库结构进行测试,但每次添加新的db脚本时也需要更新
选项3 - 只测试各个上下文:
在这个选项中,只需让EF根据上下文创建测试数据库,所有测试都将在自己的"沙箱"中运行.我不喜欢这个的原因是它不会让你觉得你要测试数据库的真实表示. …