Предупредительные знаки для непригодного для тестирования [закрытого] кода

Для моей вышеупомянутой проблемы я получил решение, как показано ниже, для этого мы должны получить помощь от JAVASCRIPT.

шаг 1: ->

создайте файл env.js в каталоге index.html, как показано ниже.

(function (window) {
    window.__env = window.__env || {};

    // API url
    window.__env.apiUrl = "http://RestWebService";

    // Whether or not to enable debug mode
    // Setting this to false will disable console output
    window.__env.enableDebug = true;
  }(this));

Смысл вышеупомянутого файла env.js заключается только в том, что мы создаем одну глобальную переменную apiUrl для хранения URL нашего сервера. Так что мы можем получить доступ к этой переменной глобально. Затем мы добавляем элемент в раздел в нашем index.html для загрузки env.js до загрузки Angular:



  
    
    
  

  
    ...
    
    

  

По умолчанию файлы JavaScript, такие как env.js, не копируются в выходной каталог когда мы создаем наше приложение.

Чтобы убедиться, что файл копируется в выходной каталог, когда мы запускаем ng build или ng serve, мы должны добавить его в раздел активов конфигурации сборки нашего приложения в angular.json:

angular. json file

{
  "projects": {
    "app-name": {
      "architect": {
        "build": {
          "options": {
            "assets": [
              "src/favicon.ico",
              "src/assets",
              "src/env.js"
            ]
          }
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              // ...
            }
          }
        }
      }
    }
  }
}

шаг 2: ->

Создайте один сервис на имя любого, в моем случае я создал его как env.service.ts в каталоге app.module .ts. это служебный файл, который будет использоваться для получения значения URL нашего сервера, который хранится в apiUrl (файл env.js).

env.service.ts

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class EnvService {

  // The values that are defined here are the default values that can
  // be overridden by env.js

  // API url
  public apiUrl = '';

  // Whether or not to enable debug mode
  public enableDebug = true;

  constructor() {
  }

}

шаг 3: ->

Создать файл поставщика услуг в том же каталоге env.service.ts.

env.service.provider.ts

import { EnvService } from './env.service';

export const EnvServiceFactory = () => {  
  // Create env
  const env = new EnvService();

  // Read environment variables from browser window
  const browserWindow = window || {};
  const browserWindowEnv = browserWindow['__env'] || {};

  // Assign environment variables from browser window to env
  // In the current implementation, properties from env.js overwrite defaults from the EnvService.
  // If needed, a deep merge can be performed here to merge properties instead of overwriting them.
  for (const key in browserWindowEnv) {
    if (browserWindowEnv.hasOwnProperty(key)) {
      env[key] = window['__env'][key];
    }
  }

  return env;
};

export const EnvServiceProvider = {  
  provide: EnvService,
  useFactory: EnvServiceFactory,
  deps: [],
};

EnvServiceProvider: -> Это угловой рецепт провайдера для регистрации EnvServiceFactory с внедрением угловой зависимости как фабрики для создания экземпляра EnvService.

EnvServiceFactory: -> Это фабрика, которая считывает значения среды из окна .__ env и создает экземпляр класса EnvService.

Таким образом, по всей сводке этого файла env.service.provider.ts мы экспортируем функцию EnvServiceFactory, которая создает экземпляр класса EnvService и копирует все значения из объекта window .__ env в экземпляр EnvService.

Наконец, чтобы зарегистрировать EnvServiceProvider как рецепт в системе внедрения зависимостей Angular, мы должны указать его в качестве провайдера в массиве провайдеров нашего приложения:

app.module.ts file

import { NgModule } from '@angular/core';  
import { EnvServiceProvider } from './env.service.provider';

@NgModule({
  imports: [ // ... ],
  providers: [EnvServiceProvider],
})
export class AppModule {} 

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

service.ts file

import { EnvService } from '../env.service';

   constructor(private _httpClinet: HttpClient, private env: EnvService) {
    }

emplLoginCheckUrl = this.env.apiUrl+"/checkValidUser";

 validateUserDetails(employeeDetails): Observable {
        console.log(this.emplLoginCheckUrl);
        return this._httpClinet.post(this.emplLoginCheckUrl, employeeDetails);
    }

Вот и все для шага 3.

шаг 4: ->

наконец, что мы должны сделать перед обслуживанием приложения, мы должны собрать приложение с помощью ng build --prod, чтобы получить папку dist, которая содержит файл env.js. оттуда мы можем изменить наши URL, если вы измените URL, он автоматически применит новый измененный URL в нашем приложении.

ДЛЯ ПОЛУЧЕНИЯ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ посетите сайт ниже, спасибо Юргену Ван де Море.

https://www.jvandemo.com/how-to-use-environment-variables-to-configure-your-angular-application-without-a-rebuild/

12
задан Mitch Wheat 5 January 2009 в 10:03
поделиться

10 ответов

Посмотрите следующее сообщение в блоге Miško Hevery: Как Записать 3v1L, Непригодный для тестирования Код.

11
ответ дан 2 December 2019 в 03:49
поделиться

Трудно кодированные зависимости.

6
ответ дан 2 December 2019 в 03:49
поделиться

Ни одна из тех вещей не делает код непригодным для тестирования. Они могут мешать находить ошибки пограничного случая, но, если Вы полностью указали критерии успеха тестирования (и разработка через тестирование упрощает это), все, что необходимо сделать, передать критерии.

TDD может относиться к поведению определенных частей, а также проекта в целом, таким образом, можно легко протестировать очень маленькие компоненты. Но, это предназначено для тестирования результатов, не средств, которыми были получены те результаты.

Если тесты проходятся, Вы отвечали требованиям. Если существуют ошибки, после которых, это - проблема с тестами, не протестированный код (в этом случае, тесты должны быть изменены для ловли ранее непредвиденной проблемы).

Вы не должны заботиться (с точки зрения доставки функциональности), существует ли некоторое время оператор в одном из Ваших конструкторов. Необходимо ли спросить себя что мандаты бизнес-требования это? Я сильно сомневаюсь, что Ваш клиент поставит список требований включая "наследование, ограниченное 4 уровнями". Они могут перечислить "без ошибок" как требование, но необходимо будет согласовать их вниз на том :-).

12
ответ дан 2 December 2019 в 03:49
поделиться
  • Не программирование к интерфейсам
  • Newing возражает вместо этого использования ФАБРИК/МОК
4
ответ дан 2 December 2019 в 03:49
поделиться

Работа, сделанная в классах GUI, который не имеет никакого отношения к презентации. GUI должен быть полностью отделен из базовой модели.

2
ответ дан 2 December 2019 в 03:49
поделиться

Код непригоден для тестирования, пока Вы не можете изменить его. Если у Вас есть возможность осуществить рефакторинг проект, никакой код не непригоден для тестирования. Обычно, только очень маленькие модификации необходимы для создания тестирования легче. И они могут быть выровнены по ширине, потому что они увеличивают качество кода.

Даже в случаях Вы описываете, код не обязательно непригоден для тестирования. Просто более трудно протестировать. Например, легче к тестовому коду, если можно изолировать доступ к базе данных и избежать их во время модульных тестов. Но если Вы имеете к, можно поднять базу данных, выделенную запущению тестов.

1
ответ дан 2 December 2019 в 03:49
поделиться

Я сказал бы, что ни одна из тех вещей не делает код непригодным для тестирования. Они действительно делают поблочное тестирование трудным, потому что каждое из тех увеличений, связывающихся в Вашей реализации.

Среди других раздражений, которые делают поблочное тестирование трудным:

  • код графического интерфейса пользователя смешан с кодом бизнес-логики
  • все антишаблоны, но Бог возражают в особенности (http://en.wikipedia.org/wiki/God_object)
  • в том же направлении огромная функция является также очень раздражающей

В целом любая рекомендация, которую Вы могли бы услышать о создании лучшего кода, является также рекомендацией для более легкого к коду модульного теста.

1
ответ дан 2 December 2019 в 03:49
поделиться

Базы данных! Особенно те, которые имеют триггеры!

Я знаю, что можно дразнить базу данных, но я всегда находил, что большинство ошибок в моем коде (главным образом Приложения типа CRUD) является проблемами данных/отображения и если Вы дразните базу данных, Вы не находите такую ошибку.

1
ответ дан 2 December 2019 в 03:49
поделиться

Руководство Miško Hevery по Записи Тестируемого Кода детализирует дефекты, которые делают код трудно для тестирования. Его список накладывается с Вашим несколько, но вдается в невероятные подробности.

  • Конструктор делает Реальную Работу
  • Рытье в сотрудников
  • Хрупкое глобальное состояние и одиночные элементы
  • Класс делает слишком много
1
ответ дан 2 December 2019 в 03:49
поделиться

отсутствие разделения на уровни, избыток связи... т.е. класса Y был записан для знания приблизительно X, но это не было должно, X быть допускающим повторное использование. Существуют прочные отношения между тестируемостью и возможностью многократного использования.

0
ответ дан 2 December 2019 в 03:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: