我是单位测试的新手。
我必须在以下代码中测试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
写一个正确的单元测试是什么?
答案 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或适当值列表。您必须编写代码以预测要比较的预期值。
在验证服务按设计工作后,使用相同的技术转到使用该服务的类。