我写了一个处理程序,它基本上收集了三条关于错误的信息:它来自哪个应用程序;异常的堆栈跟踪;和异常的错误消息。根据该信息,我使用业务规则,在数据库中为每个应用程序设置,以对每个错误进行分类。
对于我的单元测试,我需要能够控制应用程序的业务规则,以便我可以正确地预测类别。由于源应用程序参数是一个枚举,我将TestApp值添加到该枚举中并在我的所有内容中使用它。
现在我们要发布了,我的代码审查员正确地要我从枚举中删除TestApp。显然这会破坏我的单元测试编译。如果我将TestApp更改为真实的,现在我可以编译,但我的测试将主要失败,因为真实应用程序的业务规则是不同的(并且可能会更改)。
以下是我所说的简化示例:
void Main()
{
var fooError = new MyError
{
Application = Application.TestApp1,
ErrorMessage = "my error message here",
ErrorTime = DateTime.Now,
StackTrace = "stack trace here",
User = "mike"
};
Console.WriteLine("That error is of category {0}.", BusinessLogicForErrors(fooError));
}
string BusinessLogicForErrors(MyError error)
{
string errCat;
if (error.Application == Application.RealApp)
errCat = "Horrible";
else
errCat = "Not So Bad";
return errCat;
}
enum Application
{
RealApp,
TestApp1,
TestApp2
}
class MyError
{
public Application Application;
public DateTime ErrorTime;
public string ErrorMessage;
public string StackTrace;
public string User;
}
我想我可以删除Application枚举并使用字符串代替,我只是想以正确的理由来做。此外,这可能更符合集成测试而非单元测试,因此可能是错误(或者应该使用模拟)。
我该怎么做才能解决这个问题?我应该从一开始就做些什么才能避免呢?