其他答案是正确的,依赖倒置原则将帮助您测试此代码。我将通过在您的测试类中模拟 _service 来测试此代码。您可以使用适当的模拟框架或通过提供服务接口的模拟实现来做到这一点。这是两个选项的工作示例。
被测代码
这是我们正在尝试测试的代码。有几点需要注意:
- 我们通过将服务传递给
ClassToTest 构造函数来应用依赖倒置原则。
- 我在
Category 类中实现了一个Equals 方法。这样可以更轻松地测试此代码。
public class ClassToTest
{
private readonly IService _service;
public ClassToTest(IService service)
{
_service = service;
}
public IList<Products> GetProducts(string categoryId)
{
var items = _service.Get(new Category { id = categoryId, flag = true });
return items;
}
}
public interface IService
{
IList<Products> Get(Category category);
}
public class Category
{
public string id;
public bool flag;
public override bool Equals(object obj)
{
Category c = obj as Category;
if (c == null)
{
return false;
}
return c.id == id && c.flag == flag;
}
}
public class Products
{
}
使用起订量进行测试
我首选的模拟框架是 Moq,但我相信其他框架也适用于这个用例。这是使用 Moq 的测试:
[Test]
public void MoqTest()
{
// Arrange.
var mockService = new Mock<IService>();
var target = new ClassToTest(mockService.Object);
// Act.
target.GetProducts("test");
// Assert.
var expectedCategory = new Category {id = "test", flag = true};
mockService.Verify(t => t.Get(expectedCategory));
}
没有模拟框架的测试
如果您不想,则无需使用适当的模拟框架。您可以提供自己的模拟实现:
public class MockService : IService
{
public Category CategoryReceived { get; private set; }
public IList<Products> Get(Category category)
{
CategoryReceived = category;
return new List<Products>();
}
}
然后像这样测试你的代码:
[Test]
public void PoorMansTest()
{
// Arrange.
var mockService = new MockService();
var target = new ClassToTest(mockService);
// Act.
target.GetProducts("test");
// Assert.
var expectedCategory = new Category { id = "test", flag = true };
Assert.That(mockService.CategoryReceived, Is.EqualTo(expectedCategory));
}