2017-12-27 22 views
0

Ich habe immer folgenden Fehler, während ich versuche, folgende Testfall ausgeführt, die die URL validieren sollte. Bei Bedarf sollte die Funktion validateUrl der URL das Präfix "http: //" hinzufügen. Ich tue dies, weil die API Ich habe nicht diesen Präfix verwenden:Jest TypeError: Kann 'Speicher' von undefined nicht lesen

import userDetail from '../src/container/user-detail' 

describe('UrlValidation',() => { 
    it('should be a valid string',() => { 
    var result = new userDetail() 
    result.validateUrl("google.com") 
    exept (result).toBe("http://google.com") 
    }) 
}) 

userDetail wie folgt aussehen:

import React, { Component } from 'react'; 
import { connect } from "react-redux"; 

class UserDetail extends Component { 
    renderUser(userData){ 
    return (
     <tr key={userData.id}> 
     <td> 
      {userData.name} 
     </td> 
     <td> 
      <a target="_blank" href={this.validateUrl(userData.website)}>{userData.website}</a> 
     </td> 
     <td> 
      {userData.address.city} 
     </td> 
     <td> 
      <a> 
       <img alt="edit" src="./media/edit-icon.svg" className="edit-img"></img> 
      </a> 
     </td> 

     </tr> 
    ); 
    } 
    validateUrl(providedUrl){ 
     var url = providedUrl; 
     var r = new RegExp('/^(http|https):\/\/[^ "]+$/'); 
     if (!r.test(url)) { 
      return "http://" + providedUrl 
     } else { 
      return providedUrl 
     } 
    } 
    render() { 
     const {users} = this.props 
     console.log(users.map(user => this.renderUser(user))); 
     return (
      <table className="table table-hover"> 
       <thead> 
        <tr> 
         <th>Name</th> 
         <th>Website</th> 
         <th>City</th> 
         <th>Edit</th> 
        </tr> 
       </thead> 
       <tbody> 
        {users.map(user => this.renderUser(user))} 
       </tbody> 
      </table> 
    )} 
    } 

    function mapStateToProps({ users }){ 
    return { users }; // { user } == { user: user } 
    } 

    export default connect(mapStateToProps)(UserDetail); 

Ich habe keine Ahnung, was in der Definition mein Fehler ist.

Mein erster Gedanke, dass die Funktion validateUrl nicht zugänglich ist, aber es sollte sein.

Die Ausgabe sieht wie folgt aus:

[email protected] ~/dev/User-Manager/UserManagement $ npm test

[email protected] test /home/joshii/dev/User-Manager/UserManagement jest

FAIL tests/app.test.jsx UrlValidation ✕ should be a valid string (3ms)

● UrlValidation › should be a valid string

TypeError: Cannot read property 'store' of undefined 

    3 | describe('UrlValidation',() => { 
    4 |  it('should be a valid string',() => { 
    >5 |  var result = new userDetail() 
    6 |  result.validateUrl("google.com") 
    7 |  exept (result).toBe("http://google.com") 
    8 |  }) 
    9 | }) 

    at new Connect (node_modules/react-redux/lib/components/connect.js:102:29) 
    at Object.<anonymous> (__tests__/app.test.jsx:5:18) 

Test Suites: 1 failed, 1 total Tests: 1 failed, 1 total Snapshots: 0 total Time: 0.744s, estimated 1s Ran all test suites. npm ERR! Test failed. See above for more details.

+0

Haben Sie versucht, spöttisch reduing 'speichern' zu scherzen? –

+0

@JohnKennedy Nein, aber ich benutze nur diese Klasse und gebe eine Zeichenfolge damit. Es benutzt nichts vom Redux-Laden, oder liege ich falsch? –

+0

Ihre Root-Komponente ist in die 'Provider'-Komponente eingebunden, die' store' als Prop unterstützt. –

Antwort

0

Sie validateUrl Funktion mehr wie Bibliotheksfunktion sieht eher als eine Klasse Mitglied (Sie this nicht überall verwenden sie es), so würde ich vorschlagen, dass Sie es bewegen zu eine separate lib-Datei (und vielleicht wieder woanders in Ihrem Code). Testen wäre viel einfacher als dann;)

Wenn Sie jedoch nur Ihre validateUrl-Funktion ohne den Redux-Teil testen möchten, versuchen Sie, die Klasse separat zu exportieren (z. B. Export zu Ihrer Klassendefinition wie export class UserDetail extends Component {....} hinzuzufügen) und dann in Ihrem Testfall:

import {UserDetail} from ''../src/container/user-detail' 

describe('UrlValidation',() => { 
    it('should be a valid string',() => { 
    var result = new UserDetail() 
    result.validateUrl("google.com") 
    expect(result).toBe("http://google.com") 
    }) 
}) 
+0

danke, ich werde das versuchen und danach werde ich meinen Status aktualisieren. :) –

+0

ist es nicht möglich, nur die Klasse zu exportieren, weil in der '' 'user.map' nicht verwendbar ist, wenn ich nicht die Methode connect verwende. –

+0

ist es möglich, nur die Klasse zu exportieren. Die '' mit 'user.map', die Sie erwähnen, befindet sich in der Funktion' render() ', die nicht vom Test aufgerufen wird. Sie müssen sich nur um die Requisiten kümmern, wenn Sie eine Funktion replizieren oder testen, die von den Requisiten abhängt (und Sie können die Requisiten auch mit "new UserDetail ({users: mockedUsersArray}) instanziieren)') –

Verwandte Themen