-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2017-12-7 #40
Comments
VSCode 忽略搜索哪些文件夹 "search.exclude": {
"**/.git": true,
"**/build": true,
"**/node_molecules": true,
"**/bower_components": true,
"**/tmp": true
} |
use Hugo to make a blog |
frontend/containers/product/index.tsx Product.getInitialProps = ({
query,
context
}: InitialProps): Promise<ProductProps> => {
const productCode: api.IProductCode = { code: (query && query.code) || "" };
if (!productCode.code) {
throw errNotFound;
}
const service = makeService(api.ProductService, context);
return service.getProduct(productCode).then(productResponse => {
if (!productResponse.product) {
throw errNotFound;
}
const properties: base.IProperty[] =
(productResponse.product && productResponse.product.filterProperties) ||
[];
const topLevelCategory: base.IProperty = properties.find(
({ field }) => field === "TopLevelCategory"
) || { values: [] };
const filterProperties: products.IFilterProperty[] = [
{
field: "TopLevelCategory",
groupType: products.FilterGroupType.PRODUCT,
inValues: topLevelCategory.values
}
];
return service
.filterProducts({ filterProperties, page: 1, perPage: 5 })
.then(({ result, rdGroups }) => {
const products = ((result && result.products) || [])
.filter(({ code }) => code !== productCode.code)
.slice(0, 4);
const productsResponse: api.IProductsResponse = {
products,
rdGroups
};
return {
productResponse,
productsResponse
} as ProductProps;
});
});
}; api/products.proto service ProductService {
rpc GetProduct (ProductCode) returns (ProductResponse);
rpc GetProducts (ProductCodes) returns (ProductsResponse);
rpc GetFilterGroups (products.SearchOptions) returns (FilterProductsResponse);
rpc FilterProducts (products.SearchOptions) returns (FilterProductsResponse);
} 没有找到,就throw一个errorNotFound的错误, 输出错误信息 const errNotFound = new ProductNotFound(404);
class ProductNotFound extends Error {
constructor(public statusCode: number) {
super("product not found");
}
} frontend/proto.d.ts文件里面可以找到base.IProperty export namespace base {
/** Properties of a Property. */
interface IProperty {
/** Property field */
field?: string;
/** Property values */
values?: string[];
}
...
} /** for filter products */
namespace products下的interface IProduct有这个过滤属性,类型就是base.IProperty
filterProperties?: base.IProperty[];
const properties: base.IProperty[] =
(productResponse.product && productResponse.product.filterProperties) ||
[]; 而base.IProperty是namespace base下的interface IProperty,这个接口需要两个可选参数filed,和values
const topLevelCategory: base.IProperty = properties.find(
({ field }) => field === "TopLevelCategory") || { values: [] }; 设置过滤条件为*TopLevelCategory*, 需要修改为*TopLevelCollection*
const filterProperties: products.IFilterProperty[] = [
{
field: "TopLevelCategory",
groupType: products.FilterGroupType.PRODUCT,
inValues: topLevelCategory.values
}
];
class SearchOptions { //选择条件
class AggregateCondition {//合计条件
interface IFilterProperty { // 过滤属性
/** FilterProperty field */
field?: string;
/** FilterProperty groupType */
groupType?: products.FilterGroupType;
/** FilterProperty inValues */
inValues?: string[];
/** FilterProperty isNegative */
isNegative?: boolean;
}
}
}
|
主要是解决将topLevelCategory换成topLevelCollection的问题 frontend/product/productField.ts enum ProductField {
TopLevelCategory = "TopLevelCategory",
SubCategory = "SubCategory",
Collection = "Collection",
Material = "Material",
ColorDescription = "ColorDescription",
Size = "Size",
TotalLength = "TotalLength",
MaximumWidth = "MaximumWidth"
}
frontend/index.ts
TopLevelCategory
Collection
但是最后和Jaden讨论之后,明白产品没有collection这个属性,而是用TopLevelCategory. |
学习怎么使用postman调用后台数据 本地的API数据 http://localhost:9800/api/ja/api.ProductService/FilterProducts |
Promise没有完成 import Product from ".";
import { ProductProps } from "./mobile";
import { api, products, base } from "../../proto";
import { productResponse, productsResponse } from "./fakeData";
import { testContext } from "../../testHelper";
const properties: base.IProperty[] =
(productResponse.product && productResponse.product.filterProperties) ||
[];
const topLevelCategory: base.IProperty = properties.find(
({ field }) => field === "TopLevelCategory"
) || { values: [] };
const filterProperties: products.IFilterProperty[] = [
{
field: "TopLevelCategory",
groupType: products.FilterGroupType.PRODUCT,
inValues: topLevelCategory.values
}
];
describe("Product.getInitialProps", () => {
test("happy filter path", async () => {
const response: typeof api.ProductService.prototype.getProduct(productResponse.product.code) = () =>
Promise
.resolve(new api.ProductResponse(productResponse))
.then(() => {
const filterResponse: typeof api.ProductService.prototype.filterProducts({ filterProperties, page: 1, perPage: 5 })= () =>
Promise.resolve(new api.FilterProductsResponse(productsResponse))
})
api.ProductService.prototype.getProduct = jest.fn(response);
const props = await Product.getInitialProps(testContext());
const expected: ProductProps = { productResponse: productResponse, productsResponse: productsResponse};
expect(props).toMatchObject(expected);
});
test("failing filter API call", () => {
const error = new Error("test error");
api.ProductService.prototype.filterProducts = jest.fn(() =>
Promise.reject(error)
);
expect.hasAssertions();
return expect(Product.getInitialProps(testContext())).rejects.toBe(error);
});
test("failing API call", () => {
const error = new Error("test error");
api.ProductService.prototype.getProduct = jest.fn(() =>
Promise.reject(error)
);
expect.hasAssertions();
return expect(Product.getInitialProps(testContext())).rejects.toBe(error);
});
}); |
import Product from ".";
import { ProductProps } from "./mobile";
import { api } from "../../proto";
import { productResponse, productsResponse } from "./fakeData";
import { testContext } from "../../testHelper";
describe("Product.getInitialProps", () => {
test("happy path", async () => {
const getProductResponse: typeof api.ProductService.prototype.getProduct = () =>
Promise.resolve(new api.ProductResponse(productResponse));
const getProductsResponse: typeof api.ProductService.prototype.getFilterGroups = () =>
Promise.resolve(new api.FilterProductsResponse(productsResponse));
api.ProductService.prototype.getProduct = jest.fn(getProductResponse);
api.ProductService.prototype.getFilterGroups = jest.fn(getProductsResponse);
const props = await Product.getInitialProps({
...testContext(),
query: { code: "xxx" }
});
const expected: ProductProps = {
productResponse: productResponse,
productsResponse: productsResponse
};
expect(props).toMatchObject(expected);
});
test("failing API call", () => {
const error = new Error("test error");
api.ProductService.prototype.getProduct = jest.fn(() =>
Promise.reject(error)
);
api.ProductService.prototype.getFilterGroups = jest.fn(() =>
Promise.reject(error)
);
expect.hasAssertions();
return expect(
Product.getInitialProps({ ...testContext(), query: { code: "xxx" } })
).rejects.toBe(error);
});
}); |
总共12个case
|
first try import Product from ".";
import { ProductProps } from "./mobile";
import { api } from "../../proto";
import {
productResponse,
filterProductsResponse,
filteredProductsResponse
} from "./fakeData";
import { testContext } from "../../testHelper";
describe("throw error", () => {
test("fail to get product code", () => {
const error = new Error("fail to get product code");
expect.hasAssertions();
return expect(
Product.getInitialProps({
...testContext()
})
).rejects.toEqual(error);
});
test("fail to make service", () => {
const error = new RangeError("index out of range: 5 + 4 > 7");
expect.hasAssertions();
return expect(
Product.getInitialProps({
...testContext(),
query: {
code: "ES-43"
}
})
).rejects.toEqual(error);
});
test("fail to call api getProduct", () => {
const error = new Error("getProduct error");
api.ProductService.prototype.getProduct = jest.fn(() =>
Promise.reject(error)
);
expect.hasAssertions();
return expect(
Product.getInitialProps({
...testContext(),
query: {
code: "ES-43"
}
})
).rejects.toEqual(error);
});
test("fail to call api getFilterGroups", () => {
const error = new Error("getProduct error");
api.ProductService.prototype.getFilterGroups = jest.fn(() =>
Promise.reject(error)
);
expect.hasAssertions();
return expect(
Product.getInitialProps({
...testContext(),
query: {
code: "ES-43"
}
})
).rejects.toEqual(error);
});
test("failing API call", () => {
const error = new Error("test error");
api.ProductService.prototype.getProduct = jest.fn(() =>
Promise.reject(error)
);
api.ProductService.prototype.getFilterGroups = jest.fn(() =>
Promise.reject(error)
);
expect.hasAssertions();
return expect(
Product.getInitialProps({
...testContext(),
query: {
code: "ES-43"
}
})
).rejects.toEqual(error);
});
});
describe("Product.getInitialProps", () => {
test("happy path", async () => {
const getProductResponse: typeof api.ProductService.prototype.getProduct = () =>
Promise.resolve(new api.ProductResponse(productResponse));
const getFilterProductsResponse: typeof api.ProductService.prototype.filterProducts = () =>
Promise.resolve(new api.FilterProductsResponse(filterProductsResponse));
api.ProductService.prototype.getProduct = jest.fn(getProductResponse);
api.ProductService.prototype.filterProducts = jest.fn(
getFilterProductsResponse
);
const props = await Product.getInitialProps({
...testContext(),
query: {
code: "ES-43"
}
});
const expected: ProductProps = {
productResponse: productResponse,
productsResponse: filteredProductsResponse
};
expect(props).toMatchObject(expected);
});
});
describe("test filter data", () => {
const cases: Array<
[string, string | null, Array<String> | null, {} | any]
> = [
[
"filtered products don't contain the product",
"ES-00",
["ES-01", "ES-02", "ES-03"],
["ES-01", "ES-02", "ES-03"]
],
[
"filtered products contain the product",
"ES-00",
["ES-00", "ES-01", "ES-02"],
["ES-01", "ES-02"]
],
["filtered products = null", null, null, null],
[
"filtered products's length <= 4 and doesn't contain product",
"ES-00",
["ES-01"],
["ES-01"]
],
[
"filtered products'length>4 and doesn't contain the product",
"ES-00",
["ES-01", "ES-02", "ES-03", "ES-04", "ES-05"],
["ES-01", "ES-02", "ES-03", "ES-04"]
]
];
cases.forEach(([desc, productCode, filterProduct, filteredProduct]) => {
test(`${desc}`, () => {
var filterProductResult: Array<String> | null = new Array();
if (filterProduct && filterProduct.length <= 4) {
filterProductResult = ((filterProduct && filterProduct) || []).filter(
product => product !== productCode
);
} else {
filterProductResult = ((filterProduct && filterProduct) || [])
.filter(product => product !== productCode)
.slice(0, 4);
}
expect(filterProductResult).toMatchObject(filteredProduct);
});
});
}); 两个错误“Expected at least one assertion to be called but received none.” |
TopLevelCategory -> Collectionfrontend/containers/popupShops:
frontend/containers/popupShops.test.js
主要测试
Promise对象,resolve和reject。resolve表示成功,reject表示被拒绝
frontend/proto.d.ts, 类型声明文件, PopupShopService里面有一个all方法,返回一个Promise对象
frontend/proto.js,实现文件, 用变量
PopUpShopService.prototype.all
调用all
方法api/popupshop.proto 后端文件有一个service类型的PopUpShopService,有一个rpc类型的All方法,返回一个PopupList
错误处理文件在frontend/prottp/index.ts文件下
三个错误,一个networkerror表示网络错误,可以通过Promise的reject得到
而其他两个错误是得到数据之后,验证错误提示哪一个field出错和Authorication权限错误
400以上的都是http错误
The text was updated successfully, but these errors were encountered: