主頁 > 軟體工程 > fixture.detectchanges()方法導致測驗用例失敗

fixture.detectchanges()方法導致測驗用例失敗

2021-11-08 17:08:10 軟體工程

我正在使用 Karma 和 jasmine 對我的組件進行單元測驗。fixture.detechChanges() 應該用于每個測驗以檢測更改。但是這種方法使測驗用例失敗并給出錯誤

錯誤:InvalidPipeArgument:“無法將“無效日期”轉換為管道“DatePipe”的日期

由于我是新手,任何人都可以讓我知道為什么會這樣,以及使用它的正確位置是什么。

在三個測驗用例中,第二個測驗用例失敗了。我做了很多研究,但我不確定為什么我的測驗用例失敗了。

下面是我的代碼

資源概述.component.ts

import { ResourceOverviewService } from '../../../../services/detail/resource-overview/resource-overview.service'
import {
  Component,
  OnInit,
} from '@angular/core';
import { UtilsService } from '../../../../services/common/utils.service';
import { Router, ActivatedRoute } from '@angular/router';
@Component({
  selector: 'app-resource-overview',
  templateUrl: './resource-overview.component.html',
  styleUrls: ['./resource-overview.component.scss']
})
export class ResourceOverviewComponent implements OnInit {
  uuid = '--';
  resourceName = '--';
  status = '--';
  provider = '--';
  providerAccount = '--';
  resourceCategory = '--';
  resourceType = '--';
  region = '--';
  overviewTags = '--';
  correlationID = '--';
  showMore = true;
  crn = '--'
  lastupdated : any;
  providerAccountName = '--'
  resourceId = '--'
  creationDate = '--'
  description = '--'
  tags = '--'
  dateTimeFormat = 'MMM d, y h:mm a';
  lastUpdateTime: any;
  dateTimeZone: any;
  keyValue : { key: any, value: any }[] = [];
  id = '--';
  providerLastUpdated = '--';
  providerStatus = '--';
  breadcrumbs = [];
  launchpadURL = `/launchpad`;
  
  constructor(
    private readonly resourceOverviewService: ResourceOverviewService,
    private readonly utilsService: UtilsService,
    private readonly router: Router,
    readonly route: ActivatedRoute,
  ) {}

  ngOnInit() {
    this.id = this.route.snapshot.queryParamMap.get('id');
    this.getDetails();
    // this.route.queryParams.subscribe(params => {
    //   console.log("---", params)
    //   this.id = params.id
    //   this.getDetails();
    // })
  }

  viewInventory(){
    this.router.navigate(['..'], {
      relativeTo: this.route
    });
  }

  getDetails() {
    if (this.id) {
      this.getResourceOverview();
    }
  }

  getResourceOverview(): void {
    const resourceID = `search_keys=${"resource_id"}&search=${this.id}`
    this.resourceId = this.id
    this.resourceOverviewService
      .getResourceOverview(resourceID)
      .subscribe(
        (response) => {
          const result = response as any;
          if (result && result.raw_items[0]) {
            this.uuid = result.raw_items[0].uuid  || '--';
            this.resourceName = result.raw_items[0].gpd.provider_resource_name || '--';
            this.status = result.raw_items[0].gpd.status || '--'; 
            this.provider = result.raw_items[0].gpd.provider_code || '--';
            this.providerAccountName = result.raw_items[0].gpd.provider_account_name || '--';
            this.providerAccount = result.raw_items[0].gpd.provider_account || '--';
            this.resourceCategory = result.raw_items[0].gpd.service_category || '--';
            this.resourceType = result.raw_items[0].gpd.provider_resource_type || '--';
            this.region = result.raw_items[0].gpd.provider_resource_location || '--';
            this.keyValue = result.raw_items[0].gpd.tags;
            this.crn = result.raw_items[0].gpd.provider_resource_crn || '--';
            this.lastupdated = new Date(Date.parse(result.raw_items[0].gpd.discovery_lastupdated)) || '--' ;
            this.providerLastUpdated = result.raw_items[0].gpd.provider_resource_lastupdated || '--' ;
            this.dateTimeZone = this.utilsService.getLocalBrowserTime(this.lastupdated) || '--' ;
            this.dateTimeFormat = this.utilsService.getDateTimeFormat() || '--' ;
            this.creationDate = result.raw_items[0].gpd.provider_resource_created || '--' ;
            this.correlationID = result.raw_items[0].gpd.correlation_id || '--' ;
            this.providerStatus = result.raw_items[0].gpd.provider_status || '--' ;
          }
        },
        (error) => {
          console.log('Resource overview details failed with error', error);
        }
      );
  }
}

資源概述.component.spec.ts

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { HttpWrapperService } from '../../../../services/common/http-wrapper.service';
import { ResourceOverviewComponent } from './resource-overview.component';
import { NGXLogger } from 'ngx-logger';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { CarbonComponentsModule } from '@cloudMatrix-CAM/cb-carbon-components-lib';
import { CarbonModule } from '../../../../../carbon.module';
import { ApiContractService, CbTranslationUiLibModule, TranslationService,AuthenticationContractService } from '@cloudMatrix-CAM/cb-common-ui';
import { MockNGXLogger } from '../../../../components/discovery-inventory/list-view/list-view.component.spec';
import { convertToParamMap, Router } from '@angular/router';
import { ApiService } from '../../../../services/common/api.service';
import { CUSTOM_ELEMENTS_SCHEMA, DebugElement } from '@angular/core';
import { CbCommonDiscoveryManagementMicroUiService } from '../../../../services/cb-common-discovery-management-micro-ui.service';
import { ActivatedRoute } from "@angular/router";
import { throwError, of, Observable  } from 'rxjs';
import { RouterModule } from '@angular/router'
import { ResourceOverviewService } from 'projects/cb-common-discovery-management-micro-ui/src/app/services/detail/resource-overview/resource-overview.service';

class mockHttpWrapperService {
  readonly isApiReady = false;
}

describe('ResourceOverviewComponent', () => {
  let component: ResourceOverviewComponent;
  let fixture: ComponentFixture<ResourceOverviewComponent>;
  let resourceOverviewService: any;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ ResourceOverviewComponent ],
      imports: [
        CarbonComponentsModule,CarbonModule,CbTranslationUiLibModule.forRoot(),
        RouterModule.forRoot([]),
      ],
      providers: [
        { provide: NGXLogger, useClass: MockNGXLogger },
        { provide: HttpWrapperService, useClass: mockHttpWrapperService },
        { provide: Router, useClass: class { navigate = jasmine.createSpy("navigate"); }},
        ApiService,
        ApiContractService,
        ResourceOverviewService,
        TranslationService,
        CbCommonDiscoveryManagementMicroUiService,
        {
          provide: ActivatedRoute,
          useValue: {
            params: of({ id: 'aeb24ca0549c', code: 'IBM' }),
            snapshot: {
              queryParamMap: convertToParamMap({
                id: 'aeb24ca0549c',
                code: 'IBM',
              })
            }
          }
        },
      ],
      schemas: [CUSTOM_ELEMENTS_SCHEMA],
    })
    .compileComponents()
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(ResourceOverviewComponent);
    component = fixture.debugElement.componentInstance;
    // fixture.detectChanges();
  });

  it('should create component ', () => {
    expect(component).toBeTruthy();
  });

  it('should init object for action tabs', async () => {
    await fixture.whenStable();
    component.ngOnInit();
    fixture.detectChanges();
    expect(component).toBeTruthy();
  });

  it('should get resource data ', () => {
    resourceOverviewService = TestBed.inject(ResourceOverviewService);
    const data = {"raw_items":[{"uuid":"123456789:i-0105345f167219fbf:vms","gpd":{"version":"0.1","discovery_lastupdated":"2021-09-08T05:36:08Z","correlation_id":"aws-123456789-i-0105345f167219fbf","core_credential_id":["credid"],"provider_code":"aws","provider_account":"123456789","provider_account_name":"accountname","provider_account_details":{"cb84865d-3477-40f3-9131-4462273cfedb":"accountname"},"provider_resource_type":"vms","provider_resource_id":"i-0105345f167219fbf","provider_resource_name":"cd-642","provider_resource_lastupdated":"","provider_resource_created":"2021-08-30T06:12:49Z","provider_resource_crn":"arn:aws:ec2:us-east-1:123456789:vms/i-0105345f167219fbf","provider_resource_location":"us-east-1","provider_status":"running","location_geo_coordinates":{"latitude":38.86726,"longitude":-77.233959},"status":"Active","service_category":"compute","tags":[{"Key":"Name","Value":"cd-642"}],"raw_config_data":null,"extended_data":null}}],"meta":null,"pagination":{"count":1,"total":1,"offset":0,"limit":10,"first":"https://local-core.gravitant.net/discovery/api/inventory/v1/service?limit=10","last":"https://local-core.gravitant.net/discovery/api/inventory/v1/service?limit=10","next":"","prev":""}};
    spyOn(resourceOverviewService, "getResourceOverview").and.callFake(() => {
      return of(data)
    })
    component.getDetails();
    fixture.detectChanges();
    expect(component).toBeTruthy();
  });
});

資源概述.component.html

<div >
  <div  >
  <ibm-breadcrumb>
    <ibm-breadcrumb-item href="{{launchpadURL}}">
            Portal
        </ibm-breadcrumb-item>
        <ibm-breadcrumb-item >
    <a (click)="viewInventory()">Inventory Resource view</a>
  </ibm-breadcrumb-item>
        <ibm-breadcrumb-item >
            {{ id }}
        </ibm-breadcrumb-item>
    </ibm-breadcrumb>
  <div  >
    <label >{{ id }}</label>
  </div>
  <div>
    <label >{{ 'discovery_inventory.resource_overview.discovery_lastupdated' | translate }}
        {{lastupdated  | date : dateTimeFormat}} {{dateTimeZone}}</label>
  </div>
</div>
  <div  >
    <div  >
      <label >{{"discovery_inventory.resource_overview.overview" | translate}}</label>
    </div>
    <div >
      <div >
        <div >
          <div >
            <label >{{"discovery_inventory.resource_overview.id" | translate}}</label>
            <span
              
              title="{{ id }}"
              >{{ id }}</span
            >
          </div>
        </div>
        <div >
          <div >
            <label >{{"discovery_inventory.resource_overview.resource_type" | translate}}</label>
            <span
              
              title="{{ resourceType }}"
              >{{ resourceType }}</span
            >
          </div>
        </div>
        </div>
        <div >
        <div >
          <div >
            <label >{{
              "discovery_inventory.resource_overview.region" | translate
            }}</label>
            <span
              
              title="{{ region }}"
              >{{ region }}</span
            >
          </div>
        </div>
        <div >
          <div >
            <label >{{
              "discovery_inventory.resource_overview.tag_key_value" | translate
            }}</label>
            <div *ngFor="let k of keyValue; let i = index;">
            <span *ngIf="i!=(keyValue.length-1)"
            
            title="{{ id }}"
            >{{ k.Key }} : {{ k.Value }} ,
            </span>
            <span *ngIf="i==(keyValue.length-1)"
            
            title="{{ id }}"
            >{{ k.Key }}:{{ k.Value }}
            </span>
          </div>
          </div>
        </div>
      </div>
       <div >
        <div >
          <div >
            <label >{{
              "discovery_inventory.resource_overview.correlation_id" | translate
            }}</label>
            <span
              
              title="{{ correlationID }}"
              >{{ correlationID }}</span
            >
          </div>
        </div>
        <div >
          <div >
            <label >{{
              "discovery_inventory.resource_overview.resource_category" | translate
            }}</label>
            <span
              
              title="{{ resourceCategory }}"
              >{{ resourceCategory }}</span
            >
          </div>
        </div>
        </div>
        <div *ngIf="showMore">
        <div >
       <div >
          <div >
            <label >{{
              "discovery_inventory.resource_overview.status" | translate
            }}</label>
            <span
              
              title="{{ status }}"
              >{{ status }}</span
            >
          </div>
        </div>
        <div >
          <div >
            <label >{{
              "discovery_inventory.resource_overview.provider" | translate
            }}</label>
            <span
              
              title="{{ provider }}"
              >{{ provider }}</span
            >
          </div>
        </div>
      </div>
      
        <div >
          <div >
            <div >
              <label >{{
                "discovery_inventory.resource_overview.provider_account" | translate
              }}</label>
              <span
                
                title="{{ providerAccount }}"
                >{{ providerAccount }}</span
              >
            </div>
          </div>
          <div >
            <div >
              <label >{{
                "discovery_inventory.resource_overview.resource_name" | translate
              }}</label>
              <span
                
                title="{{ resourceName }}"
                >{{ resourceName }}</span
              >
            </div>
          </div>
        </div>
       
      </div>
      <div >
        <div  (click)="showMore = !showMore">
          <label *ngIf="showMore">{{
            "discovery_inventory.resource_overview.show_less" | translate
          }}</label>
          <label *ngIf="!showMore">{{
            "discovery_inventory.resource_overview.show_more" | translate
          }}</label>
        </div>
      </div>
    </div>
  </div>
  <div  >
    <div  >
      <label >{{"discovery_inventory.resource_overview.configuration_details" | translate}}</label>
    </div>
    <div >
      <div >
        <div >
          <div >
            <label >{{"discovery_inventory.resource_overview.account_id" | translate}}</label>
            <span
              
              title="{{ providerAccount }}"
              >{{ providerAccount }}</span
            >
          </div>
        </div>
        <div >
          <div >
            <label >{{
              "discovery_inventory.resource_overview.provider_account_name" | translate
            }}</label>
            <span
              
              title="{{ providerAccount }}"
              >{{ providerAccountName }}</span
            >
          </div>
        </div>
        
    </div>
    <div >
    <div >
      <div >
        <label >{{"discovery_inventory.resource_overview.creation_date" | translate}}</label>
        <span
          
          title="{{ creationDate }}"
          >{{ creationDate }}</span
        >
      </div>
    </div>
     <div >
            <div >
              <label >{{
                "discovery_inventory.resource_overview.provider_lastupdated" | translate
              }}</label>
              <span
                
                title="{{ providerLastUpdated }}"
                >{{ providerLastUpdated }}</span
              >
            </div>
          </div>
    </div>
    <div >
      <div >
        <div >
          <label >{{
            "discovery_inventory.resource_overview.arn" | translate
          }}</label>
          <span
            
            title="{{ crn }}"
            >{{ crn }}</span
          >
        </div>
      </div>
      <div >
        <div >
          <label >{{"discovery_inventory.resource_overview.provider_status" | translate}}</label>
          <span
            
            title="{{ providerStatus }}"
            >{{ providerStatus }}</span
          >
        </div>
      </div>
  </div>
  <div >
    <div >
      <div >
        <label >{{"discovery_inventory.resource_overview.tags" | translate}}</label>
        <div>
        <span >
          <table>
          <tr>
            <th>Key</th>
            <th>Value</th>
          </tr>
          <tr *ngFor="let k of keyValue; let i = index;">
            <td>{{k.Key}}</td>
            <td>{{k.Value}}</td>
          </tr>
        </table>
      </span>
    </div>
      </div>
    </div>
    
  </div>
    </div>
  </div>
</div>

uj5u.com熱心網友回復:

第二次測驗

您正在呼叫 component.ngOnInit(); 內部呼叫 getDetails();

第三次測驗

您正在呼叫 getDetails();

IMO,兩者都在做相同的事情,要么您可以洗掉第二個測驗并讓您的第三個測驗呼叫 component.ngOnInit(); 使用模擬 api 回應或在第二個測驗中具有相同的模擬 API 回應。

uj5u.com熱心網友回復:

問題

問題是您的測驗正在構建并為 angular 提供無效日期DatePipe由于管道存在于您的 HTML 中,因此您只會在運行后看到錯誤,detectChanges因為模板僅在那時才呈現。

錯誤發生在你lastUpdated | date:dateTimeFormat這里

<label >{{ 'discovery_inventory.resource_overview.discovery_lastupdated' | translate }}
        {{lastupdated  | date : dateTimeFormat}} {{dateTimeZone}}</label>

由于您getResourceOverview在測驗中執行(由于設定了 ID),因此還將執行以下行:

// This will construct an invalid date, since date is always truthy (even when called with "new Date(undefined)", 
// "|| '--'" will never be executed
this.lastupdated = new Date(Date.parse(result.raw_items[0].gpd.discovery_lastupdated)) || '--' ;

這有效地將無效日期(由 構造new Date(undefined))分配給您的lastupdated實體變數,從而導致您看到的錯誤。

解決方案

您要么必須確保在測驗中提供所有必要的資料和/或使您的代碼更加健壯。在這種情況下,我強烈建議在向管道提供資料之前正確檢查 undefined/null:

<label >
  {{ 'discovery_inventory.resource_overview.discovery_lastupdated' | translate }}
  
  <!-- 
    Use the terniary operator to conditionally use the pipe or fall back 
    to "--" ("--" itself would be an invalid argument for the pipe, so do 
    not provide this to the pipe directly!) 
  -->
  {{ (lastupdated ? (lastupdated | date : dateTimeFormat) : '--' }} {{dateTimeZone}}
</label>

此外,如果您無法為變數構造有效日期,則應確保分配 undefined:

this.lastupdated = result.raw_items[0].gpd.discovery_lastupdated 
  ? new Date(Date.parse(result.raw_items[0].gpd.discovery_lastupdated)) 
  : undefined ;

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/352507.html

標籤:有角的 单元测试 茉莉花 角cli 业力茉莉

上一篇:Ionic5/Angular-嘗試區分“[objectObject]”時出錯。只允許陣列和可迭代物件

下一篇:如何在離子hmtl中顯示firebase子集合?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more