gpt4 book ai didi

c# - "Test to the Interface"是什么意思?

转载 作者:太空宇宙 更新时间:2023-11-03 19:10:19 24 4
gpt4 key购买 nike

我知道这是一个通用的编程问题,但我过去曾多次在谷歌上搜索过,但从未找到确定的答案。

几个月前,我与另一家公司的一位高级工程师讨论了接口(interface)问题。他说他更喜欢为所有东西编写接口(interface),因为(除其他外)它允许他“测试接口(interface)”。当时我并没有过多地考虑这个短语,(如果我有我会直接请他解释一下!)但它让我有点困惑。

认为这意味着他将基于接口(interface)编写单元测试,然后该测试将用于分析接口(interface)的每个实现。如果那是他的意思,那对我来说是有意义的。但是,这种解释仍然让我想知道最佳实践是什么,例如,当您的一个实现公开了接口(interface)中未定义的其他公共(public)方法时?您会为该类(class)编写额外的测试吗?

提前感谢您对此主题的任何想法。

最佳答案

你确定他说的是测试界面而不是program to the interface

用非常简单的术语来说,针对接口(interface)编程 的意思是您的类不应该依赖于具体的实现。他们应该依赖于一个接口(interface)。

这样做的好处是您可以为一个接口(interface)提供不同的实现,这使您能够对您的类进行单元测试,因为您可以为该接口(interface)提供模拟/ stub 。

想象一下这个例子:

public class SomeClass{
StringAnalyzer stringAnalizer = new StringAnalizer();
Logger logger = new Logger();

public void SomeMethod(){
if (stringAnalyzer.IsValid(someParameter))
{
//do something with someParameter
}else
{
logger.Log("Invalid string");
}
}
}

对比一下:

class SomeClass
{
IStringAnalyzer stringAnalizer;
ILogger logger;

public SomeClass(IStringAnalyzer stringAnalyzer, ILogger logger)
{
this.logger = logger;
this.stringAnalyzer = stringAnalyzer;
}


public void SomeMethod(string someParameter)
{
if (stringAnalyzer.IsValid(someParameter))
{
//do something with someParameter
}else
{
logger.Log("Invalid string");
}
}
}

这使您能够像这样编写测试:

[Test]
public void SomeMethod_InvalidParameter_CallsLogger
{
Rhino.Mocks.MockRepository mockRepository = new Rhino.Mocks.MockRepository();
IStringAnalyzer s = mockRepository.Stub<IStringRepository>();
s.Stub(s => s.IsValid("something, doesnt matter").IgnoreParameters().Return(false);
ILogger l = mockRepository.DynamicMock<ILogger>();
SomeClass someClass = new SomeClass(s, l);
mockRepository.ReplayAll();

someClass.SomeMethod("What you put here doesnt really matter because the stub will always return false");

l.AssertWasCalled(l => l.Log("Invalid string"));
}

因为在第二个示例中您依赖于接口(interface)而不是具体类,所以您可以在测试中通过伪造 轻松地交换它们。这只是优点之一,归根结底,这种方法使您能够利用多态性,这不仅对测试有用,而且对您可能需要的任何情况都有用为您的类的依赖项提供替代实现。

可以找到上面示例的完整解释 here .

关于c# - "Test to the Interface"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21190518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com