对于需要访问操作系统系统变量的应用程序的TDD方面,您通常如何?
例如,我的应用程序需要能够正确检索操作系统当前登录的用户名。
所以我TDD是一个执行此操作的函数,它被称为:
string getUserNameFromSystemEnvironment();
我遇到的问题是:
我正在我的机器上运行测试,所以我知道用户名是什么(比如FooBar
)。我通过在我的测试中硬编码getUserNameFromSystemEnvironment()
来TDD FooBar
。
EXPECT_EQ(getUserNameFromSystemEnvironment(), "FooBar");
显然,这个测试在我的机器上运行正常,但在其他机器上运行不正常。为了使它在正常运行
但是,其他人,我需要使用getUserNameFromSystemEnvironment()
。但是,那种方式会破坏测试的目的,因为我们会:
EXPECT_EQ(getUserNameFromSystemEnvironment(),
getUserNameFromSystemEnvironment());
有什么想法吗?
答案 0 :(得分:5)
如果要查看此内容,则需要设置模拟。创建一个返回用户ID的接口,一个调用getUserNameFromSystemEnvironment()
的实现,以及一个返回告诉它返回的字符串的模拟。
但那不是你想要做的。如果您尝试测试getUserNameFromSystemEnvironment()
,那么您将有效地测试操作系统功能。您不需要测试其他人的代码。相反,将getUserNameFromSystemEnvironment()
放入接口,并模拟系统的其他部分。然后,例如,要测试LoginValidator
,传入一个将usename作为“Foobar”返回的模拟,并验证它是否验证了登录。然后添加一个测试,该测试返回一个不应验证的用户名,并验证它是否不允许它进入。
答案 1 :(得分:2)
确保价值回归,您并不总是需要知道确切的价值。
测试不需要100%完美,他们只需要增加您对代码的信心。