MSTest 与 Moq - DAL 设置

2024-05-24

我是最小起订量新手,刚刚开始一个已经在开发的项目。我负责设置单元测试。 DatabaseFactory 有一个使用 EnterpriseLibrary 的自定义类,如下所示:

public Database CreateCommonDatabase()
{
  return CreateDatabaseInstance(string.Empty);
}

private static Database CreateDatabaseInstance(string foo)
{
  var database = clientCode == string.Empty
      ? DatabaseFactory.CreateDatabase("COMMON")
      : new OracleDatabase(new ClientConnections().GetConnectionString(foo)));
  return database;
}

现在,这是使用它的地方(ResultData 是 DataSet 类型的另一个类):

public ResultData GetNotifications(string foo, string foo2, Database database)
{
    var errMsg = string.Empty;
    var retval = 0;
    var ds = new DataSet();

    var sqlClause =
    @"[Some SELECT statement here that uses foo]";

    DbCommand cm = database.GetSqlStringCommand(sqlClause);
    cm.CommandType = CommandType.Text;

    // Add Parameters
    if (userSeq != string.Empty)
    {
      database.AddInParameter(cm, ":foo2", DbType.String, foo2);
    }

    try
    {
      ds = database.ExecuteDataSet(cm);
    }
      catch (Exception ex)
    {
      retval = -99;
      errMsg = ex.Message;
    }

    return new ResultData(ds, retval, errMsg);
}

现在,最初,数据库没有作为参数传入,但该方法使用 CreateCommonDatabase 方法创建 DatabaseFactory 的新实例,并从那里使用它。然而,这使得该类无法测试,因为我无法阻止它实际访问数据库。因此,我使用依赖注入,并传入数据库。

现在,我陷入困境,因为没有办法模拟数据库来测试 GetNotifications。我想知道我是否把事情过于复杂化了,或者我是否遗漏了一些东西。我这样做的方式正确吗?或者我应该重新考虑如何进行设置?

编辑以添加更多信息*****

我真的不想测试数据库。我希望 Data.Notifications 类(上面)返回 ResultData 的实例,但这就是我真正想要测试的全部。如果我上升到业务层,我会得到以下内容:

public DataSet GetNotifications(string foo, string foo1, out int returnValue, out string errorMessage, Database database)
{
    ResultData rd = new data.Notifications().GetNotifications(foo, foo1, database);

    returnValue = rd.ResultValue;
    errorMessage = rd.ErrorMessage;

    return rd.DataReturned;
}

所以,最初,数据库没有传入,而是由 Data.Notifications 类创建的 - 但话又说回来,如果我这样保留它,我就忍不住要访问数据库来测试这个业务层对象。我修改了所有代码以传递数据库(它创建了网络的基本页面),但现在我不确定下一步要做什么。我以为我只需要一个单元测试就可以解决这个问题,但显然,要么我错了,要么我在正确的道路上遇到了心理障碍。


如果其中的方法是虚拟的,您应该能够创建一个模拟数据库对象。如果不是,那么你就遇到了一些问题。

我不知道“数据库”是什么类型,但你有几个选择。

  1. 如果您拥有数据库的源代码,我建议提取接口 IDatabase,而不是处理数据库类类型。这将消除一些复杂性并为您提供非常可测试的东西。

  2. 如果您无权访问 Database 类,则始终可以通过另一层抽象来解决此问题。在这种情况下,许多人使用包装数据访问层的存储库模式。一般来说,在这种情况下,大多数人将测试 Respository 类留给集成测试(没有任何隔离的测试),而不是单元测试。

以下是使用选项 #1 设置测试的方法:

[TestMethod]
public void GetNotifications_PassedNullFoo_ReturnsData()
{
     //Arrange
     Mock<IDatabase> mockDB = new Mock<IDatabase>();
     mockDB.Setup(db => db.ExecuteDataSet()).Returns(new DataSet() ... );

     //Act
     FooClass target = new fooClass();
     var result = target.GetNotifications(null, "Foo2", mockDB.Object);

     //Assert
     Assert.IsTrue(result.DataSet.Rows.Count > 0);
}

我的数据集代码有点生疏,但希望这能为您提供总体思路。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MSTest 与 Moq - DAL 设置 的相关文章

  • 日期时间类型转换器

    我有下面的代码将字符串转换为 T 类型 它适用于所有其他类型 但当 T 为 DateTime 类型时会出现错误 TypeConverter c TypeDescriptor GetConverter typeof T return T c
  • 在 MS 企业库或 Log4net 等第 3 方组件上创建包装器是一个好习惯吗?

    这更像是一个很好的练习题 我想提供不同的通用库 如日志记录 缓存等 有很多第三方库 如 MS 企业库 log4Net NCache 等 我想知道直接使用这些服务或在每个服务上创建包装器并使用 DI 在代码中注入该服务是否是一个好习惯 reg
  • 如何使用 Moq 返回数据或值列表?

    谁能告诉我如何使用 Moq 框架使用模拟对象返回数据列表并将返回的数据列表分配给另一个 List 变量 public class SomeClass public virtual List
  • 使用 Moq 模拟实体框架 6 ObjectResult

    如何使用 Moq 模拟 Entity Framework 6 ObjectResult 以便对依赖 EF 数据库连接的代码进行单元测试 沿着这些思路阅读了大量的问题和答案 并从我所读到的内容中收集了许多有价值的信息 我已经实现了我认为相当优
  • 存储库和服务层之间的区别

    我查看了一些相关的问题 但仍然没有看到存储库和服务层之间有太大区别 所以给出的例子我想它应该看起来像这样 如果不是请告诉我为什么 public interface ProductRepository extends CrudReposito
  • Moq - 是否可以在不使用 It.IsAny 的情况下设置模拟

    我一直使用 Moq 进行单元测试 有时我会嘲笑有很多参数的方法 想象一下这样的方法 public class WorkClient public void DoSomething string itemName int itemCount
  • Microsoft.Practices.EnterpriseLibrary.Data.DLL 但未在用户代码中处理

    搜索google并使用Enterprise Library data access来连接数据库 仅使用安装的数据访问包https www nuget org packages EnterpriseLibrary Data https www
  • 如何通过 NUnit 有效地对使用 ADO.NET 和 SQL Server 的 DAL 进行单元测试?

    因此 您在 C 中有一个使用存储库模式的 DAL 并且每个存储库都有一个接口 它由 ADO NET MS SQL Server 和存储过程调用支持 这对于在进行单元测试时对正在其他地方使用的存储库进行存根 模拟非常有用 我喜欢它 不过 我很
  • 起订量和代码合同

    当使用类不变量时 代码契约似乎到处注入代码 像这样的东西 ContractClassFor typeof IX interface IXContract ClassInvariant void Invariant ContractClass
  • 我如何模拟 ServiceStack IHttpRequest

    我正在尝试使用请求过滤器对将项目注入 IHttpRequest Items 的服务进行单元测试 this RequestFilters Add req res dto gt simplified for readability var re
  • 为什么在调用 Asp.Net ListBox 自动回发方法时会调用不相关的(自动回发)方法?

    我确信这很简单 但它让我发疯 我的页面上有一个列表框来显示艺术家 当索引更改时它会调用一个方法 还有一个按钮 单击时会从另一个页面中的该列表中加载艺术家
  • 需要帮助理解这段代码

    我正在尝试学习单元测试 我正在尝试对我在 asp net mvc 1 0 中制作的一些会员资格内容进行单元测试 我一直在关注一本关于 MVC 的书 我对一些东西感到困惑 希望有人能为我解答 我的框架使用 Nunit 和 Moq 问题一 pu
  • HttpContext 中需要什么才能允许 FormsAuthentication.SignOut() 执行?

    我正在尝试为我们的注销方法编写一个单元测试 除其他外 它FormsAuthentication SignOut 然而 它抛出一个System NullReferenceException 我创建了一个模拟 HttpContext 使用起订量
  • Autofixture 和 WebApi 控制器

    我正在使用 AutoFixture 尝试测试 WebApi 站点的控制器 我正在将 AutoData 功能与 Moq 一起使用 如上所述普洛的博客 http blog ploeh dk 2010 10 08 AutoDataTheories
  • 为实体框架中的实体创建基类

    我想创建一个对我的所有实体都通用的基类 该类将具有 Save Delete GetByID 等方法以及其他一些基本功能和属性 我在 Linq to SQL 方面有更多经验 希望能在 EF 中获得一些类似的好示例 谢谢 像这样 public
  • 如何从 MSTEST 运行单个测试用例

    我正在使用 MStest 运行单个测试用例 但找不到正确的命令 I tried 1 mstest exe testcontainer testproject dll test MethodTest1这将运行从名称 MethodTest1 开
  • 无法安装NuGet包

    我正在尝试将 Unity 包添加到我的解决方案中 但我不断收到列出的消息 尝试解决依赖项 Unity 3 5 1404 0 Unity 已经具有为 CommonServiceLocator 定义的依赖项 知道如何解决这个问题吗 旧版本的 n
  • MSTest.exe (VS2012) 崩溃 QTAgent32.exe

    我正在尝试通过 cmdline 执行我们的测试 我使用VS2012 但总是出现此错误 当我在同一台机器上直接在 VS2010 中运行测试时 它们运行良好 我无法将 VS2010 用于 cmdline 因为我们的许可证错误 程序集查找不起作用
  • Moq - 如何对方法中引用的更改进行单元测试

    另一天 另一个问题 我的服务层有以下方法 public MatchViewData CreateMatch string user var matchViewData HasReachedMaxNumberOfMatchesLimit us
  • 何时使用模拟框架?

    因此 我正在使用模拟框架 Moq 进行单元测试 并且想知道何时应该使用模拟框架 以下两个测试之间的优点 缺点是什么 public class Tests Fact public void TestWithMock Arrange var r

随机推荐

  • 使用 urllib2 进行 Python 身份验证

    所以我尝试使用 python 从名为 vsearch cisco com 的网站下载文件 python Connects to the Cisco Server and Downloads files at the URL specifie
  • 具有多个输入的kerasvalidation_data

    我尝试使用validation data方法 但是有问题 model fit X macd train X rsi train X ema train Y train sample weight sample weight validati
  • Magento:获取给定产品的购物车数量

    我使用这个代码 items Mage getModel checkout cart gt getQuote gt getAllItems items Mage getSingleton checkout session gt getQuot
  • 如何重写复杂的C++代码行(嵌套三元运算符)

    我一直在查看别人的代码以进行调试 发现了这一点 m seedsfilter good true m seedsfilter 1 good newClusters Sp good newSeed Sp 这是什么意思 是否有一个自动化工具可以将
  • R中两个时间之间的时间差

    我正在尝试计算 R 中两个时间之间的差异 例如 两个时间之间的时间差 03 15 和 01 40 将为 1 小时 35 分钟 我在 R 中尝试了以下代码 difftime 03 15 01 40 tz units secs 但我收到以下错误
  • 如何停止覆盖数据

    我正在尝试在我的 iOS 应用程序中保存一些数据 我使用以下代码 NSArray paths NSSearchPathForDirectoriesInDomains NSDocumentDirectory NSUserDomainMask
  • Gmail API:如何在 swift 上将附件发送到草稿

    最近 我的项目添加了使用Gmail 所以我遇到了很多关于它的问题 这让我很伤心 现在 我想知道如何将图像发送到草稿 我的代码如下 func postEmailMessageRequest model MEMailMessageModel r
  • 仅对小型设备使用偏移的中心引导列

    我正在尝试在图像旁边显示文本 我希望它仅在设备宽度低于 767px 时才堆叠 否则 我希望他们肩并肩 在此堆叠过程中 图像具有响应性 因此它占据了文本上方的整行 为了避免这种情况 我尝试在列为xs时限制列的大小 这可确保图像在指定的列大小内
  • 如何在 ios 应用程序中将 .svg url 显示为图像

    我从服务器获取 svg 网址 如何在我的应用程序中将其显示为图像 我尝试在 UIWebView 中显示它 但无法调整内容图像的大小 我正在使用这个代码 let request NSURLRequest NSURLRequest url UR
  • Postgres 多重连接

    这是一个 postgres 数据库 我试图从品种表中提取狗的品种名称 卡斯罗 拉布拉多等 以根据动物表中的外键进行显示 我的问题是动物表有两个外键指向这个单一品种表 并且我的查询不断出错 第一个品种名称将根据左连接返回 但第二个品种名称无法
  • PolyML 函数和类型

    一对函数tofun int gt a gt a and fromfun a gt a gt int这样 fromfun o tofun n评估为n对于每一个n int 任何人都可以向我解释这实际上要求什么 我正在寻找更多对此的解释 而不是实
  • 是否可以使用 nginx 合并两个 json 响应?

    我有一个现有的快速端点 如下所示 app get route id async req res gt try const id req params id const result await dbFn id res send result
  • UE4:将游戏帧输出到文件

    这适用于虚幻引擎 4 9 每一帧 我想将其保存到文件中 覆盖现有的 对于我制作的一个简单的 D3D11 演示 我可以使用以下命令来完成此操作 void Engine CaptureFrame D3DX11 IMAGE FILE FORMAT
  • C#中out参数有什么用

    你能告诉我具体的用途是什么吗out范围 相关问题 ref 和 out 和有什么不一样 C https stackoverflow com questions 516882 what is the difference between ref
  • 哪些mysql设置影响LOAD DATA INFILE的速度?

    让我来介绍一下情况 我们尝试将适量的行数 大约每天 10 20M 插入到宽度适中的 MyISAM 表中 Field Type Null Key Default Extra blah1 varchar 255 NO PRI blah2 var
  • Java监听按钮和键盘点击

    如何监听按下的按键并触发 JButton 例如 我在面板上有 A JButton 作为 GUI 我在 aButton 上实现了一个按钮监听器 它将把屏幕更改为其他内容 我希望通过鼠标单击和按下键盘来触发此按钮 如何通过按键盘上的 a 来触发
  • 为什么“0 && true”在 JavaScript 中返回 0 而不是布尔值?

    我确信 Javascript 中的任何逻辑表达式都会返回布尔值 但该表达式返回数字 0 而不是布尔值 0 true gt 0 为什么会这样 在这种情况下 我该如何处理 Javascript 中的逻辑表达式以防止将来出现此类错误 背景故事 我
  • 无法访问 Github 403 错误:权限被拒绝

    我是 Git Github 的新手 所以请原谅我的困惑 问题是 我刚刚对本地存储库进行了更改 并且想推送到 Github 上的原点 特别是 gh pages 之前 我一直在使用另一个 Github 帐户 因此我更改了 user name 和
  • 可从数组观察

    我目前对 Angular2 和 Observable 对象有疑问 我有一个调用服务的组件 一个链接到 api 的真实组件和一个假组件 链接到 API 的服务运行良好 但当我使用假的服务时 我想从 Observable 对象返回一个数组 但出
  • MSTest 与 Moq - DAL 设置

    我是最小起订量新手 刚刚开始一个已经在开发的项目 我负责设置单元测试 DatabaseFactory 有一个使用 EnterpriseLibrary 的自定义类 如下所示 public Database CreateCommonDataba