如何在没有接口实现的情况下编写单元测试

时间:2015-03-07 01:00:56

标签: c# unit-testing

我是单位测试的新手。

我必须在以下代码中测试RefreshAmount

private readonly int id;

private readonly IService service;

public MyClass(int id, IService service)
{    
    this.id= id;
    this.service= service;    
}

public double Number { get; private set; }

public void RefreshAmount()
{    
    Number= service.GetTotalSum(id);    
}

RefreshAmount写一个正确的单元测试是什么?

2 个答案:

答案 0 :(得分:3)

您需要模拟 IService。有各种框架可以帮助您自动执行此操作(例如Moq),但这是一个简单的示例:

public class MockService : IService
{
    public double GetTotalSum(int id)
    {
        return 10;
    }
}

基本上,mock会实现您的接口,但只返回硬编码(或其他众所周知的)数据。这样可以很容易地知道您的预期价值应该是多少!现在您可以使用它来进行测试:

public void TestMethod()
{
    MyClass testObj = new MyClass(1, new MockService());

    testObj.RefreshAmount();
    Assert.Equals(10, testObj.Number);
}

答案 1 :(得分:-1)

首先开始简单地尝试“晴天”或“快乐路径”......

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
         var service = new MyService();
         int SomeProperInteger = GetNextInteger();
         double SomeProperAmount = .50;
         var actual = service.GetTotalSum(SomeProperInteger);
         double expected = SomeProperInteger * SomeProperAmount;
         Assert.IsTrue(expected = actual, "Test Failed, Expected amount was incorrect.");

    }
    private int GetNextInteger()
    {
        throw new System.NotImplementedException();
    }
}

首先测试将在生产中使用的服务对象,如上所示。您将不得不查看代码以查看GetTotalSum应该执行的操作或查看规范。一旦“快乐路径”工作,那么您将使用边界一次最多改变1个参数。上面代码中的Boundaries来自GetNextInteger或适当值列表。您必须编写代码以预测要比较的预期值。

在验证服务按设计工作后,使用相同的技术转到使用该服务的类。