所以我有一个工厂类,我正在尝试研究单元测试应该做什么.从这个问题我可以验证返回的接口是我期望的特定具体类型.
如果工厂返回具体类型,我应该检查什么(因为目前不需要使用接口)?目前我做的事情如下:
[Test]
public void CreateSomeClassWithDependencies()
{
// m_factory is instantiated in the SetUp method
var someClass = m_factory.CreateSomeClassWithDependencies();
Assert.IsNotNull(someClass);
}
Run Code Online (Sandbox Code Playgroud)
这个问题是Assert.IsNotNull看起来有点多余.
另外,我的工厂方法可能正在设置该特定类的依赖关系,如下所示:
public SomeClass CreateSomeClassWithDependencies()
{
return new SomeClass(CreateADependency(), CreateAnotherDependency(),
CreateAThirdDependency());
}
Run Code Online (Sandbox Code Playgroud)
我想确保我的工厂方法正确设置所有这些依赖项.有没有其他方法可以做到这一点来制作那些public/internal我在单元测试中检查的依赖属性?(我不是修改测试对象以适应测试的忠实粉丝)
编辑:回应罗伯特哈维的问题,我正在使用NUnit作为我的单元测试框架(但我不会认为它会产生太多差异)
对于我目前正在进行的项目,我必须将特殊格式的字符串提供给第三方服务进行处理.所以我正在建立这样的字符串:
string someString = string.Format("{0}{1}{2}: Some message. Some percentage: {3}%", token1, token2, token3, number);
Run Code Online (Sandbox Code Playgroud)
而不是硬编码字符串,我正在考虑将其移动到项目资源中:
string someString = string.Format(Properties.Resources.SomeString, token1, token2, token3, number);
Run Code Online (Sandbox Code Playgroud)
在我看来,第二种选择并不像第一种选择那样可读,即阅读代码的人必须提取字符串资源以确定最终结果应该是什么样子.
我该如何解决这个问题?在这种情况下,硬编码格式字符串是否是必要的恶魔?
我一直在重构我目前正在进行的项目的代码库,因此除了程序集的范围之外没有用的类/接口应该被声明为内部(而不是公共).但是我遇到了以下代码的问题:
internal interface IFirstInterface
{
...
}
internal interface ISecondInterface
{
IFirstInterface First{ get; }
...
}
public class Implementer : ISecondInterface
{
public IFirstInterface First {get; private set;}
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
为什么内部接口的成员必须公开实施?如果在内部类上实现接口,那么实现的成员不应该是内部的吗?这不是一个大问题,因为接口成员无论如何都不会公开访问,因为类是内部的.这似乎与直觉相反.
主要问题是上面的场景,因为我不能有一个IFirstInterface的公共getter,因为它据称是一个内部接口,即我从编译器得到以下错误:
可访问性不一致:属性类型"IFirstInterface"比属性"Implementer.First"更难访问
有没有办法解决?
注意:我意识到这个重构练习可能没什么价值,但我认为这将是一个很好的方式让我更深入地了解内部修饰符的含义.
我发现自己创建了大量的包装类,纯粹是因为我想模仿它的行为
DirectoryInfo或者WindowsIdentity)然后我发现自己附加了一个用'W'包装的类(表示它是一个包装器),所以我最终得到DirectoryInfoW(相反,DirectoryInfoWrapper它似乎相当冗长).同样,我最终使用被称为包装的本机方法NativeMethods.DuplicateTokenW.
在命名包装类时,遵循什么是一个很好的经验法则?
我们中的一些人总是不得不使用Microsoft的Visual Studio 6.0 IDE支持"遗留"代码 - 尽管意见不同 - 与Visual Studio系列IDE的后续版本相比,通常被认为不那么友好.
因此,我想了解一些最好的隐藏/记录不佳的IDE功能(可以是C++或VB).通常的做法是每个帖子的一个功能,请.
假设我有一个如下所示的类:
internal class SomeClass
{
IDependency _someDependency;
...
internal string SomeFunctionality_MakesUseofIDependency()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
然后我想添加相关的功能,但是使用不同的依赖来实现其目的.也许类似如下:
internal class SomeClass
{
IDependency _someDependency;
IDependency2 _someDependency2;
...
internal string SomeFunctionality_MakesUseofIDependency()
{
...
}
internal string OtherFunctionality_MakesUseOfIDependency2()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
当我为这个新功能编写单元测试(或者更新我对现有功能的单元测试)时,我发现自己创建了SomeClass(SUT)的新实例,同时传入null以获取我不需要的依赖项对于我想要测试的特定功能.
这对我来说似乎是一种难闻的气味,但我发现自己走这条路的原因是因为我发现自己正在为我介绍的每一项新功能创建新的类.这似乎也是一件坏事,所以我开始尝试将类似功能组合在一起.
我的问题:如果一个类的所有依赖关系都被它的所有功能所消耗,即如果不同的功能位使用不同的依赖关系,那么它们是否应该存在于不同的类中?
所以我在听Hanselminutes Podcast 158,其中Joel Spolsky提到Wasabi是一流的.NET语言.那是什么意思?
所以我有一个看起来如下的类:
public class MyClass
{
DatabaseDependency _depend;
public MyClass(DatabaseDependency depend)
{
_depend = depend;
}
public string DoSomething(DBParameter database)
{
var result = _depend.GetResults(database, ...);
string response = String.Empty;
// some logic to process the result
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
其中DBParameter是一个简单的值类,包含Server,DBName,DBType等属性.
现在,我想为DoSomething添加一个重载,以便它接受连接字符串而不是DBParameter参数(假设DatabaseDependency已经有一个接受连接字符串的GetResults重载).
我的问题:我有几个单元测试,描述了用于处理DatabaseDependency.GetResults结果的各种逻辑路径.当我向DoSomething添加重载时,我本质上会重构代码,以便这两个重载都可以重用这个逻辑(即可能将它移动到私有方法).进行单元测试的正确方法是什么?我是否需要进行尽可能多的单元测试来验证我添加的新重载的所有逻辑路径?
在我正在处理的应用程序中,日志记录工具使用sprintf格式化写入文件的文本.所以,像:
char buffer[512];
sprintf(buffer, ... );
Run Code Online (Sandbox Code Playgroud)
当发送的消息对于手动分配的缓冲区而言变得太大时,这有时会导致问题.
有没有办法获得sprintf行为而无需像这样手动分配内存?
编辑:虽然sprintf是一个C操作,我正在寻找C++类型的解决方案(如果有的话!)让我得到这种行为......
c# ×3
c++ ×2
string ×2
unit-testing ×2
.net ×1
c ×1
class-design ×1
factory ×1
ide ×1
interface ×1
internal ×1
localization ×1
memory ×1
overloading ×1
resources ×1
single-responsibility-principle ×1
tdd ×1
vb6 ×1
wrapper ×1