Javascript 如何在单元测试中检查私有状态?

Javascript 如何在单元测试中检查私有状态?,javascript,unit-testing,Javascript,Unit Testing,我在网上读了一些讨论。他们说,我们不应该对私有方法进行单元测试或检查私有状态,因为这是实现细节,是糟糕设计的标志。但就我而言,我真的不知道如何做得更好 下面是一个示例代码(我的实际代码是使用factory编写的,但我尝试使用纯js创建一个相同的案例,这样每个人都更容易理解,因为相同的原因是闭包): 在我真正的应用程序中,我可以注入和模拟本地存储,但这是一个问题。 我的问题是如何测试refreshtstate方法是否设置了其私有状态,因为我无法验证其值: state.property1 = pro

我在网上读了一些讨论。他们说,我们不应该对私有方法进行单元测试或检查私有状态,因为这是实现细节,是糟糕设计的标志。但就我而言,我真的不知道如何做得更好

下面是一个示例代码(我的实际代码是使用factory编写的,但我尝试使用纯js创建一个相同的案例,这样每个人都更容易理解,因为相同的原因是闭包):

在我真正的应用程序中,我可以注入和模拟本地存储,但这是一个问题。 我的问题是如何测试
refreshtstate
方法是否设置了其私有状态,因为我无法验证其值:

state.property1 = property1;
state.property2 = property2;

我正在考虑存根本地存储并使用
getState
方法获取状态。但是它看起来像是集成测试,因为
getState
有它自己的逻辑,我无法摆脱。

监视一个本地存储模拟并断言它是用一些参数调用的,否则您将测试两件事,
refreshtstate
完成它的工作,
getState
完成它的工作

describe('closure', function () {
  it('#refreshState', function () {
    var localStorageSpy = jasmine.createSpyObj('window.localStorage', ['setItem',]);

    var closure = closure();
    closure.refreshState('params', 'params2');
    expect(localStorageSpy.getItem).toHaveBeenCalledWith('params', 'whatevs');

  });
});

当然我会模仿本地存储(这就是我正在做的)。在refreshState中,我想测试两件事:内存中的状态被更新,状态被保存到localstorage(我可以通过模拟本地存储来测试这一点)但我无法测试内存中的状态是否已更新。如果要确保内存中的状态是最新的,则必须添加进一步的检查并实现可以测试的异常处理-您要测试的内容非常具体,因此不应取决于实际值,而应取决于方法的流程。我希望正确理解您的问题,但我建议,如果您担心state.property1和state.property2被设置,您应该测试property1和property2参数是否有效,如果无效,则抛出错误/异常。然后使用单元测试,您可以监视抛出的异常,而不必验证文本值。@rpaskett:这些属性没有检查,它们是具有任何值的字符串。对,我的意思是,如果您执行类似于
if(typeof property1!=“string”){throw new Error()}
,这将确保您的state.property1被分配一个有效值,如果没有抛出错误,那么您的单元测试可以对此进行检查(假设您的单元测试框架确实可以监视抛出的错误)。
describe('closure', function () {
  it('#refreshState', function () {
    var localStorageSpy = jasmine.createSpyObj('window.localStorage', ['setItem',]);

    var closure = closure();
    closure.refreshState('params', 'params2');
    expect(localStorageSpy.getItem).toHaveBeenCalledWith('params', 'whatevs');

  });
});