Javascript 对象属性的茉莉花测试
我想做什么Javascript 对象属性的茉莉花测试,javascript,jasmine,Javascript,Jasmine,我想做什么 describe('my object', function() { it('has these properties', function() { expect(Object.keys(myObject)).toEqual([ 'property1', 'property2', ... ]); }); }); 但是当然,Object.keys返回一个数组,根据定义,数组是有序的……我更愿意让这个测试通过,而不管属性的顺序
describe('my object', function() {
it('has these properties', function() {
expect(Object.keys(myObject)).toEqual([
'property1',
'property2',
...
]);
});
});
但是当然,Object.keys
返回一个数组,根据定义,数组是有序的……我更愿意让这个测试通过,而不管属性的顺序如何(这对我来说是有意义的,因为无论如何都没有对象键顺序的规范……(至少在ES5之前)
我如何验证我的对象具有它应该具有的所有属性,同时确保它没有丢失任何属性,而不必担心按正确的顺序列出这些属性 太棒了
或者,您可以使用外部检查,如(包装myObject.hasOwnProperty(prop)
):
最简单的解决方案?排序
var actual = Object.keys(myObject).sort();
var expected = [
'property1',
'property2',
...
].sort();
expect(actual).toEqual(expected);
以下是一些可能的新解决方案:
- 这有一个模块:
- 使用ES2016,您也可以使用地图并将对象转换为地图
\uhas
或Object.hasOwnProperties
开始,但是的输出在失败时预期false为truthy
不是很有用
使用下划线的交集可以获得更好的预期/实际输出
var actualProps = Object.keys(myObj); // ["foo", "baz"]
var expectedProps =["foo","bar"];
expect(_.intersection(actualProps, expectedProps)).toEqual(expectedProps);
在这种情况下,故障看起来更像
预期['foo']等于['foo',bar']
本主题我迟到了,但有一种方法允许您检查对象是否具有属性或键/值对:
it('should contain object keys', () => {
expect(Object.keys(myObject)).toContain('property1');
expect(Object.keys(myObject)).toContain('property2');
expect(Object.keys(myObject)).toContain('...');
});
expect(myObject).toHaveProperty(key);
expect({"a": 1, "b":2}).toHaveProperty("a");
或
我更喜欢用这个;因为,您有更多的可能执行独立测试
import AuthRoutes from '@/router/auth/Auth.ts';
describe('AuthRoutes', () => {
it('Verify that AuthRoutes be an object', () => {
expect(AuthRoutes instanceof Object).toBe(true);
});
it("Verify that authroutes in key 'comecios' contains expected key", () => {
expect(Object.keys(AuthRoutes.comercios)).toContain("path");
expect(Object.keys(AuthRoutes.comercios)).toContain("component");
expect(Object.keys(AuthRoutes.comercios)).toContain("children");
expect(AuthRoutes.comercios.children instanceof Array).toBe(true);
// Convert the children Array to Object for verify if this contains the spected key
let childrenCommerce = Object.assign({}, AuthRoutes.comercios.children);
expect(Object.keys(childrenCommerce[0])).toContain("path");
expect(Object.keys(childrenCommerce[0])).toContain("name");
expect(Object.keys(childrenCommerce[0])).toContain("component");
expect(Object.keys(childrenCommerce[0])).toContain("meta");
expect(childrenCommerce[0].meta instanceof Object).toBe(true);
expect(Object.keys(childrenCommerce[0].meta)).toContain("Auth");
expect(Object.keys(childrenCommerce[0].meta)).toContain("title");
})
});
但是第二种方法是不能忽略这些值,对吗?!很好的一点,OP需要第一种方法来处理“测试键存在而不测试值”的用例,向
jasmine竖起大拇指。objectContaining
partWelcome to StackOverflow!只有代码的答案不被认为是高质量的。请详细说明您的代码的作用以及它如何帮助解决问题。虽然此代码可以回答问题,但提供有关它如何和/或为什么解决问题的其他上下文将提高答案的长期价值。我没有看到toHaveProperty()
方法。这是给茉莉花的吗?那个方法对茉莉花不适用
expect(myObject).toHaveProperty(key);
expect({"a": 1, "b":2}).toHaveProperty("a");
expect(myObject).toHaveProperty(key,value);
expect({"a": 1, "b":2}).toHaveProperty("a", "1");
import AuthRoutes from '@/router/auth/Auth.ts';
describe('AuthRoutes', () => {
it('Verify that AuthRoutes be an object', () => {
expect(AuthRoutes instanceof Object).toBe(true);
});
it("Verify that authroutes in key 'comecios' contains expected key", () => {
expect(Object.keys(AuthRoutes.comercios)).toContain("path");
expect(Object.keys(AuthRoutes.comercios)).toContain("component");
expect(Object.keys(AuthRoutes.comercios)).toContain("children");
expect(AuthRoutes.comercios.children instanceof Array).toBe(true);
// Convert the children Array to Object for verify if this contains the spected key
let childrenCommerce = Object.assign({}, AuthRoutes.comercios.children);
expect(Object.keys(childrenCommerce[0])).toContain("path");
expect(Object.keys(childrenCommerce[0])).toContain("name");
expect(Object.keys(childrenCommerce[0])).toContain("component");
expect(Object.keys(childrenCommerce[0])).toContain("meta");
expect(childrenCommerce[0].meta instanceof Object).toBe(true);
expect(Object.keys(childrenCommerce[0].meta)).toContain("Auth");
expect(Object.keys(childrenCommerce[0].meta)).toContain("title");
})
});