小编iva*_*e94的帖子

'对象'类型上不存在属性'json'

我正在尝试使用角度为2的HttpClient通过REST获取数据.我在这里按照角度教程https://angular.io/tutorial/toh-pt6并在英雄和HTTP部分下你会看到这段代码用于通过http获取英雄数据.

getHeroes(): Promise<Hero[]> {
  return this.http.get(this.heroesUrl)
         .toPromise()
         .then(response => response.json().data as Hero[])
         .catch(this.handleError);
}
Run Code Online (Sandbox Code Playgroud)

以下是我在我的应用程序中编写的类似版本

fetch(startIndex: number, limit: number): Promise<Order[]> {
    let url = this.baseUrl + "&startIndex=" + startIndex + "&limit=" + limit;

    return this.http.get(url)
                .toPromise()
                .then(response => response.json().results as Order[])
                .catch(this.handleError);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用InteliJ Idea,并且在调用response.json()时有一条红线,即使我尝试使用ng build构建,我也会收到错误.

属性'json'在'Object'类型上不存在.

您可能会注意到,而不是json().datajson().results.这是因为根据教程,服务器响应了一个具有data字段的对象,但我自己的服务器使用具有results字段的对象进行响应.如果您向下滚动教程,您会看到这一点.

请注意服务器返回的数据的形状.此特定的内存中Web API示例返回具有data属性的对象.您的API可能会返回其他内容.调整代码以匹配您的Web API.

为了解决这个问题,我试过这样的事情

(response: Response) => response.json().results as Order[]
Run Code Online (Sandbox Code Playgroud)

当我这样做时,.json()方法已被解决,但另一个错误弹出

Promise类型不存在属性结果

我尝试通过定义一个接口来修复它

interface OrderResponse {
    orders: Order[]; …
Run Code Online (Sandbox Code Playgroud)

typescript angular angular-httpclient

34
推荐指数
2
解决办法
8万
查看次数

创建目录的单元测试代码

我有创建目录并将文件传输到其中的代码。我想对其进行单元测试。但是问题是当我运行单元测试时,会创建这些目录,但是我不想要那样。我希望代码仅在运行生产环境时才创建这些目录。我已经对此进行了搜索,但是所有搜索结果都建议使用JUnit类TemporaryFolder。但这不是我想要的。我没有在测试用例中创建目录。我只是测试创建它们的代码。因此,不确定TemporaryFolder类如何帮助我。说我有下面的代码

public class Util {

    public File getLocation(String location) {
        File result = new File(location);

        if (!result.exists()) {
            result.mkdirs(); 
        }
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何对此类代码进行单元测试?每次我打电话

util.getLocation("base/location"); 
Run Code Online (Sandbox Code Playgroud)

目录的基础/位置正在创建,但我不想要。仅当我在生产环境中运行代码时才应创建它们。

更新 由于对问题的评论。我决定更新我的问题。首先,getLocation签名有点误导。那不是我正在测试的确切代码,它的时间很长,所以我试图以此传达想法。它的功能基本相同,但问题在于getLocation()不带参数,如上所示。在getLocation内部,调用了另一个方法,该方法将字符串返回路径。这意味着我无法控制用于创建目录的内容。而且,我同时运行生产和开发环境,并且在运行生产代码时创建了这些目录后,即使重新构建了代码也不应删除它们,因为单元测试将在每个构建上运行。

public File getLocationForReports() {

    String softwareHome = GeneralUtil.getSoftwareHome();
    File path = new Path(softwareHome, "reports").toFile();

    if (!path.exists()) {
        path.mkdirs();    
    }
    return path;
}
Run Code Online (Sandbox Code Playgroud)

正如您在上面看到的那样,我无法控制GeneralUtil.getSoftwareHome()返回的内容,因此我什至无法发送“ tmp / location”之类的虚拟位置并稍后删除,如果这些目录我也不想删除是在运行生产代码时创建的,因为我会添加一些文件。

java junit unit-testing

1
推荐指数
1
解决办法
1131
查看次数