我不确定我的方法TranslateResponse()
还能测试什么。
它基本上检查翻译器的类型并调用翻译器的关联set()
方法。
public async Task TranslateResponse(Policy response)
{
foreach (var t in await _translatorFactory.BuildTranslators())
{
var policyTranslator = t as IPolicyAwareTranslator;
policyTranslator?.SetPolicy(response);
var additionalInterestTranslator = t as IAdditionalInterestAwareTranslator;
additionalInterestTranslator?.SetAdditionalInterests(response.AdditionalInterests);
var locationsTranslator = t as ILocationsAwareTranslator;
locationsTranslator?.SetLocations(response.Locations);
}
}
我正在为TranslateResponse()
方法编写测试用例。据我了解,我正在根据提供的翻译器类型验证对相应方法的调用。
测试用例行
Mock<ITranslator> mockedTranslator = new Mock<ITranslator>();
mockedTranslator.Setup(t => t.Translate(_translatorDataAccessor.Object));
var mockedPolicyTranslator = mockedTranslator.As<IPolicyAwareTranslator>();
mockedPolicyTranslator.Setup(t => t.SetPolicy(It.IsAny<Policy>()));
mockedPolicyTranslator.Verify(t => t.SetPolicy(It.IsAny<Policy>()), Times.AtLeastOnce);
我的担忧是
我很好奇我是否可以测试验证电话以外的其他功能?
我应该在这里还是在自己的类中测试set()方法的逻辑?即使如此,我也无法弄清楚在Set()
的测试用例中要声明什么,这将使用传入的参数设置私有字段。
public class PolicyTranslator : ITranslator, IPolicyAwareTranslator
{
private Policy _policy;
public void SetPolicy(Policy policy)
{
_policy = policy;
}
//translate()
}
答案 0 :(得分:0)
基本上,您没有什么可以测试的,只是
也许,您可能想要
.FirstOrDefault()
。BuildTranslators
没有返回任何元素的情况也是有效的情况。在大多数情况下,不应在单元测试中测试SUT依赖性,因为
在简单的情况下,例如所讨论的代码,它实际上将简化事情,因为您不再需要模拟IPolicyAwareTranslator
,并且可以简单地测试值是否按预期设置,即使在这种情况下,如果有一个小陷阱:
IPolicyAwareTranslator
-有人可以将var policyTranslator = t as IPolicyAwareTranslator;
替换为var policyTranslator = t as PolicyTranslator;
,并且测试仍然可以通过,尽管它不再可以处理我们的关键业务AwesomePolicyAwareTranslator
。您可能会说它基本上是movie-plot-threat,如果您知道自己在做什么并且不太麻烦,就可以将多个类作为一个子系统进行测试。
尽管在大多数情况下,当您可以进行适当的隔离,更简单时,我会反对这种“低级集成测试”!单元测试。
低级集成测试-基本上是一个虚构的术语,但我想说它非常适合此类测试。
不过,在某些情况下,使用粗粒度的“低级集成测试”可能比使用覆盖相同代码的单元测试要好一些。
在这种情况下,“低级集成测试”以合理的价格为您提供了很多东西(我们不要忘记100%的覆盖率是无法获得的,不能以便宜的价格建造适当的测试金字塔,因此具有成本效益)测试是必要的。