我如何对这门课进行单元测试?

时间:2010-07-15 15:23:45

标签: javascript unit-testing

假设我需要从遗留代码(目前没有单元测试)中为以下类添加单元测试。它只是一个简单的地图或字典。

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()。我如何对此进行单元测试?

3 个答案:

答案 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 */