假设我需要从遗留代码(目前没有单元测试)中为以下类添加单元测试。它只是一个简单的地图或字典。
function Map(...) { ... }
Map.prototype.put = function (key, value) {
// associate the value with the key in this map
}
Map.prototype.get = function (key) {
// return the value to which the specified key is mapped, or undefined
// if this map contains no mapping for the key
}
Map.prototype.equals = function (obj) { ... }
// ... and more bound functions
似乎无法一次只测试一个功能。例如,你不能在不调用put()的情况下测试get()。我如何对此进行单元测试?
答案 0 :(得分:1)
如果方法之间存在严重的依赖性,您可以存根或模拟所有其他方法。请查看jsMock。
答案 1 :(得分:0)
如果您正在使用数据库,那么对于“get”方法,您可以在数据库中创建带插入的DbScripts,然后获取这些插入的项目。 然后你必须创建DbScripts来删除这些添加的项目。 对于“put”测试,您必须调用get方法来检查它是否已插入。
您只需在测试基类中配置它。
[TestFixtureSetUp]
public virtual void InitializeTestData()
{
TestConfiguration.ExecuteSqlFilesInFolder(this.DefaultScriptDirectory + "\\SetUp");
if (!string.IsNullOrEmpty(this.TestFixtureSpecificScriptDirectory))
{
TestConfiguration.ExecuteSqlFilesInFolder(this.TestFixtureSpecificScriptDirectory + "\\SetUp");
}
}
[TestFixtureTearDown]
public virtual void FinalizeTestData()
{
if (!string.IsNullOrEmpty(this.TestFixtureSpecificScriptDirectory))
{
TestConfiguration.ExecuteSqlFilesInFolder(this.TestFixtureSpecificScriptDirectory + "\\TearDown");
}
TestConfiguration.ExecuteSqlFilesInFolder(this.DefaultScriptDirectory + "\\TearDown");
}
答案 2 :(得分:0)
每种方法都有明确或隐含的契约。 Map.put()接受某种输入并改变Map内部或外部的内容。为了测试该功能,您的测试需要访问变异的内容。如果它是内部的而不是外部暴露的,那么您的测试必须存在于Map类中,必须公开状态,或者必须以可以进行外部访问的方式将可变状态结构注入到类中: 即:
/*Definition*/
function MockRepository() { /*implementation of the repository*/ }
function Map(repository) { /* store the repository */ }
Map.prototype.put = function() { /* mutate stuff in the repository */ }
/*Instantiation/Test*/
var mockRepository = new MockRepository(); /*mock repository has public methods to check state*/
var myMap = new Map(mockRepository);
myMap.put(/*whatever test input*/);
/* here use the mock repository to check that mutation of state occurred as expected based on ititial state of respository and input */