在TDD中调用要测试的方法的逻辑

时间:2016-09-14 05:52:19

标签: c# unit-testing mocking tdd nunit

由于我是tdd开发的新手,我第一次尝试嘲笑而且我有 对此有疑问。

请考虑以下示例:

这里是商业

public class MyEmail
{
    public bool SendEmail()
    {
           Email code goes here 
           return true;
    }
}

Another class 

public class Customer

{
  public bool Addcustomer()
  {
     MyEmail obj = new MyEmail();
     obj.SendEmail();
     return true;
  }
}

这是我对Addcustomer的测试

[TestMethod()]
public void AddCustomerTest()
{
  Mock<Myemail> objemail = new Mock<Myemail>();

  objemail.Setup(x=>x.SendEmail()).Returns(true);

customer obj = new Customer(); //创建客户类的对象,因为   我想测试这个类中包含的方法。

现在我的问题在这里?

 obj.AddCustomer(objemail.Object);

请查看以上声明。我们在Customer类中调用了一个方法   使用参数,但实际上该方法不接受任何参数。但是该方法没有收到任何编译错误   或运行时错误。怎么可能?

它是否只发生在测试方法中,因为理想情况下不应该这样   根据c#basics编译器可以接受。

并且假设我的类Customer中的Addcustomer方法已经存在   有如下定义。那我该怎么办?

  public bool Addcustomer(int Anynumber)
  {
     MyEmail obj = new MyEmail();
     obj.SendEmail(Anynumber));
     return true;
  }

  Assert.AreEqual(obj.AddCustomer(), true);
}

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解正确以及问题是什么,但这是设置课程的更好方法:

    public class Customer
    {
      private MyEmail _myEmail;
      public void Customer(MyEmail myEmail)
      {
        _myEmail = myEmail;
      }

      public bool Addcustomer()
      {     
         _myEmail.SendEmail();
         return true;
      }
    }

[TestMethod()]
public void AddCustomerTest()
{
  Mock<Myemail> objemail = new Mock<Myemail>();

  objemail.Setup(x=>x.SendEmail()).Returns(true);
  customer obj = new Customer(objemail.Object);

  //Assert something
}