【问题标题】:Moq setup: Passing a class to a moq and checking if a property is not null?起订量设置:将类传递给起订量并检查属性是否不为空?
【发布时间】:2017-09-07 08:28:49
【问题描述】:

我有这个 POCO 课程:

public class Item
{
     public int ID {get; set; }
     public string Description { get; set; }
     public string Flag { get; set; }

我有这个存储库:

public class Repo : IRepo
{

     int CreateNewItem(Item myItem)   // defined in the IRepo interface
     {
           if (myItem.Flag == null)
              throw new ArgumentNullException("The Flag property cannot be null!!);

           // other implementation here 

           primary key = cmdSql.Reader.GetInt(0);

           return primary_key;
     }
}

现在在数据库中,标志不能为空,因此需要在属性中有一个值,因此我有一个 IF 语句来检查属性。我想设置一个 Moq 来测试一下 Flag 属性是否不为空,如果是,则抛出错误。否则,它将返回一个值,例如 1。

我该如何设置起订量?

【问题讨论】:

  • 作为记录:我假设这是 C# - 但您可能希望明确说明,例如通过添加该标签。语言可能会极大地影响您的选择空间。
  • 嗯,是的,它是 C#。我认为这对于我在示例中给出的 POCO 类中的自动属性来说非常明显
  • 事情是:你当然不应该过度标记。但是拥有特定的语言标签 also 有助于吸引观众。更多的观看者会增加您获得有用意见的机会。

标签: c# unit-testing tdd


【解决方案1】:

您的“Repo”类现在不可单元测试,因为您尚未注入“cmdSql”的依赖项。一旦你注入类型 od 'cmdsql' 然后使用模拟框架或手动模拟来模拟它。单元测试不应该有任何依赖(如数据库、文件、类依赖等),所有依赖都应该被模拟。

如果我的理解是正确的,您想要实现的是设置一个标志,这是您的实体的一个属性。您不需要模拟实体,因为没有任何依赖关系需要解决(购买你应该模拟'cmdsql',正如我之前提到的)。在您的测试方法中,您可以直接实例化实体并将标志设置为空。要测试异常,您可以使用 'ExpectedException' 属性装饰您的测试方法,如下所示,

[TestMethod()]
    [ExpectedException(typeof(ArgumentNullException))]
    public void GivenCreateNewItemWhenIPassNullFlagThenArgumentNullException()
    {
       //Arrange

      //Act

      //Assert
    }

如果你想了解依赖关系,请阅读我上周写的https://www.linkedin.com/pulse/even-config-file-dependency-unit-test-which-you-mock-viswanathan

【讨论】:

  • 使用ExpectedException 属性可能会导致您的测试因“错误”原因而失败,例如,如果某些配置代码抛出此异常。目前所有的测试框架都有方法来断言即使有预期的消息也抛出了正确的异常
  • 嗯,是的,我需要对存储库进行单元测试。这就是重点。我需要测试存储库的功能以确保一切正常。随着项目的发展,单元测试确保没有任何东西被破坏。如果是这样,至少我们缩小了它在哪里以及为什么会崩溃。
猜你喜欢
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多