Как имитировать бэкэнд-данные в Angular2

Я пытался опубликовать фиктивные данные, используя Angular2. Я пробовал следующие ссылки сегодня, но мне это не удалось.

https://www.beyondjava.net/blog/mocking-http-services-with-angular-generally/


Ссылки ниже хороши, но я не мог ими воспользоваться.

https://github.com/cornflourblue/angular2-registration-login-example/blob/master/app/_helpers/fake-backend.ts

http://embed.plnkr.co/9luTng/?show=preview

В приведенной выше ссылке есть файл fake-backend.ts, как в app/_helpers/fake-backend.ts.

поддельный бэкенд, который я включил, как в app.module.ts, но как его использовать?

Итак, я хочу зарегистрироваться, используя данные запроса данных, как показано ниже:

{
  "username": "string",
  "firstname": "string",
  "lastname": "string",
  "email": "string",
  "password": "string",
  "authtype": "plain",
  "project_license":
  "projectlicense"
}

Мой ответ должен быть таким, как показано ниже: -

{
"message": "A verification mail has been sent to your registered mail."
}

HTML-шаблон ниже: -

<div class="modal fade" id="signup-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
      <div class="modal-dialog">
      <div class="loginmodal-container">
        <div class="row">
          <h1>Sign Up</h1><br>

          <form [formGroup]="signUpForm" (ngSubmit)="onSubmit()">
            <div class="col-md-6" id="firstname">
               <input type="text" name="firstname" placeholder="First Name" formControlName="firstname">
            </div>
            <div class="col-md-6" id="lastname">
                <input type="text" name="lastname" placeholder="Last Name" formControlName="lastname">
            </div>

            <input type="text" name="user" placeholder="Enter Username" formControlName="username">
            <input type="password" name="pass" placeholder="Password" formControlName="password">
            <input type="text" name="email" placeholder="Email Address" formControlName="email">
            <input type="text" name="license" placeholder="Project License Key" formControlName="license">

            <input logOnClick type="submit" name="login" class="login loginmodal-submit" value="Create An Account">
          </form>

          <div class="login-help">
            <p>
              By clicking Create Account you agree to our terms of services & policies.
            </p>
          </div>
         </div>
      </div>
    </div>
</div>

import { Component, ReflectiveInjector } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { UserService } from '../services/user.service';
import { AlertService } from '../services/alert.service';
import { Http, BaseRequestOptions, Response, ResponseOptions, RequestMethod, XHRBackend, RequestOptions, ConnectionBackend, Headers } from '@angular/http';
import { MockBackend, MockConnection } from '@angular/http/testing';
import { async, fakeAsync, tick } from '@angular/core/testing';

import { fakeBackendFactory } from '../helpers/fake-backend';

@Component({
  selector: 'sign-up',
  templateUrl: './signup.component.html',
  styleUrls: ['./signup.component.css']
})
export class SignUpComponent {
    loading = false;

    constructor(
        private userService: UserService,
        private alertService: AlertService) { }

    signUpForm = new FormGroup({
      firstname: new FormControl('Lexo', Validators.required),
      lastname: new FormControl('Luthor', Validators.required),
      username: new FormControl('lex', Validators.required),
      password: new FormControl('batman123', Validators.required),
      email: new FormControl('[email protected]', Validators.required),
      license: new FormControl('xyz', Validators.required)
    })

    // injector = ReflectiveInjector.resolveAndCreate([
    //       {provide: ConnectionBackend, useClass: MockBackend},
    //       {provide: RequestOptions, useClass: BaseRequestOptions},
    //       Http,
    //       UserService,
    // ]);

    //_userService = this.injector.get(UserService);
    //backend:MockBackend = this.injector.get(ConnectionBackend) as MockBackend;
    //backend.connections.subscribe((connection: any) => this.lastConnection = connection);

    onSubmit(){
      console.log("Form value", this.signUpForm.value);

      this.loading = true;
      this.userService.create(this.signUpForm.value).
           subscribe(
                data => {
                    console.log(data);
                    alert("")
                },
                error => {
                    this.alertService.error(error.body);
                    this.loading = false;
      });

      let myModal:HTMLElement = document.getElementById("signup-modal");
      myModal.classList.toggle("in");
      myModal.style.display = "none";
    }
}

Моя служба регистрации выглядит следующим образом: -

Я не хочу ничего хранить в localStorage, а просто получить ответ при регистрации, как указано выше.

import { Injectable, ReflectiveInjector } from '@angular/core';
import { User } from '../models/user';
import { Http, BaseRequestOptions, Response, ResponseOptions, RequestMethod, XHRBackend, RequestOptions, ConnectionBackend, Headers } from '@angular/http';
import { MockBackend, MockConnection } from '@angular/http/testing';
import {async, fakeAsync, tick} from '@angular/core/testing';

@Injectable()
export class UserService {
    connection: MockConnection;
    users = localStorage.getItem("users");

    constructor(private http: Http) { }

    create(userInput: User) {
        let users = JSON.parse(localStorage.getItem('users'));

        console.log("users", users);
        console.log("userinput" ,userInput);

        userInput.authtype = "authtype";
        userInput.project_license = "projectlicense";

        let arrayOfUsers = [];
        arrayOfUsers.push(userInput);

        if(users == null || users == undefined) {
            localStorage.setItem('users', JSON.stringify(arrayOfUsers));
        }else {
          users.push(userInput);
          localStorage.setItem('users', JSON.stringify(users));
        }

        return this.http.post('/api/users', userInput, this.jwt()).map((response: Response) => response.json());

    }

     // private helper methods

    private jwt() {
        // create authorization header with jwt token
        let currentUser = JSON.parse(localStorage.getItem('currentUser'));
        if (currentUser && currentUser.token) {
            let headers = new Headers({ 'Authorization': 'Bearer ' + currentUser.token });
            return new RequestOptions({ headers: headers });
        }
    }
}


person Community    schedule 09.10.2017    source источник


Ответы (1)


В angular есть шпионский механизм, и вы можете его использовать.

Ниже приведены шаги, которые необходимо выполнить, чтобы издеваться над ними.

внедрить службу, компонент, директиву на испытательный стенд углового теста.

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpModule,
        ReactiveFormsModule
      ],
      declarations: [
        SomeComponent,
        GenericViewComponent
      ],
      providers: [
        SomeService,  // --> this service will be mocked by spyon
      ]
    })
      .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(SomeComponent);
    component = fixture.componentInstance;
  });

Теперь, когда ваш SomeService введен на ваш тестовый стенд, вы можете издеваться над этим сервисом в другом перед каждым

let someServiceApi = fixture.debugElement.injector.get(SomeService);
spyOn(someServiceApi, 'methodtomockfrom-someservice')
  .and.returnValue(Observable.of({status: 'okey'});
person Aniruddha Das    schedule 09.10.2017
comment
@Anirudhha Das: - Спасибо за ответ. У меня есть репозиторий github github.com/MiHawkStackOverFlow/SignIn-SignUp-MockResponse, и я хочу чтобы узнать, как теперь я могу использовать приведенный выше ответ в моем login.component.ts, когда я вхожу в систему, чтобы получить фиктивный ответ. Я включил все вышеперечисленное в свой файл app.component.spec.ts. Пожалуйста, помогите мне, если это возможно для вас. - person ; 10.10.2017
comment
@Anirudhha: - Привет, пожалуйста, помогите мне, так как я застрял в этом несколько дней. - person ; 11.10.2017
comment
Конечно, был чем-то занят. рассмотрю это через 2-3 часа, если будет время, как я планировал - person Aniruddha Das; 11.10.2017
comment
@Anirudhha: - Спасибо, чувак!!! Я добавлю детали к этому вопросу в то же время. - person ; 11.10.2017
comment
Итак, вы используете имитацию бэкэнда для своего реального http-вызова службы приложений. не для тестирования вашего приложения. я имею в виду модульный тест - person Aniruddha Das; 11.10.2017
comment
:- Да, никакого модульного тестирования, а просто смоделируйте бэкэнд, верните ответ и покажите ответ в консоли. Дайте мне знать, если вы можете ответить на это, поскольку я остро нуждаюсь в любой помощи. - person ; 11.10.2017
comment
Мы всегда использовали насмешки для модульного тестирования и никогда не использовали насмешки для реального вызова службы. Пример, которым вы следуете, - это способ, и я думаю, что попробовал его в ситуации модульного тестирования, не уверенный, что в то время я был успешным. - person Aniruddha Das; 11.10.2017
comment
Давайте продолжим обсуждение в чате. - person Aniruddha Das; 11.10.2017