Yapı birimi testleri

Firebase Emülatörleri, uygulamanızın davranışını tam olarak doğrulamayı ve Firebase Güvenlik Kuralları yapılandırmalarınızı doğrulamayı kolaylaştırır. Yerel bir ortamda birim testlerini çalıştırmak ve otomatikleştirmek için Firebase Öykünücülerini kullanın. Bu belgede özetlenen yöntemler, uygulamanız için Kurallarınızı doğrulayan birim testleri oluştururken ve otomatikleştirirken size yardımcı olacaktır.

Zaten yapmadıysanız, Firebase Öykünücüler kurmak .

Öykünücüyü çalıştırmadan önce

Öykünücüyü kullanmaya başlamadan önce aşağıdakileri aklınızda bulundurun:

  • Emülatör başlangıçta belirtilen kurallara yükleyecektir firestore.rules veya bir 'storage.rules' alanına firebase.json dosyası. Dosya yok ve kullanmak yoksa loadFirestoreRules aşağıda açıklandığı gibi ya da 'loadStorageRules' yöntemi, emülatör davranır açık kurallar sahip olarak tüm projeleri.
  • İken en Firebase SDK'leri benzeticileri olan çalışma doğrudan, sadece @firebase/rules-unit-testing alay kütüphane destekleri auth Güvenlik Kuralları, birim testleri çok daha kolay hale getirildi. Ayrıca kitaplık, aşağıda listelendiği gibi tüm verileri temizleme gibi öykünücüye özgü birkaç özelliği destekler.
  • Öykünücüler ayrıca İstemci SDK'ları aracılığıyla sağlanan üretim Firebase Auth belirteçlerini kabul edecek ve kuralları buna göre değerlendirecek, bu da uygulamanızı entegrasyon ve manuel testlerde doğrudan öykünücülere bağlamanıza olanak tanır.

Veritabanı öykünücüleri ve üretim arasındaki farklar

  • Açıkça bir veritabanı örneği oluşturmanız gerekmez. Öykünücü, erişilen herhangi bir veritabanı örneğini otomatik olarak oluşturacaktır.
  • Her yeni veritabanı kapalı kurallarla başlatılır, bu nedenle yönetici olmayan kullanıcılar okuyamaz veya yazamaz.
  • Her taklit veritabanı uygular Kıvılcım planı sınırları ve kotaları (en önemlisi, bu sınırlar 100 eşzamanlı bağlantı için her bir örneği).
  • Herhangi bir veritabanı dize kabul edecek "owner" bir yönetici doğrulama anahtarı olarak.
  • Emülatörlerin şu anda diğer Firebase ürünleriyle çalışan etkileşimleri yoktur. Özellikle, normal Firebase Kimlik Doğrulama akışı çalışmıyor. Bunun yerine, kullanabilirsiniz initializeTestApp() yöntemini rules-unit-testing bir sürer kütüphane, auth alanını. Bu yöntem kullanılarak oluşturulan Firebase nesnesi, sağladığınız varlık olarak başarıyla kimliği doğrulanmış gibi davranır. İçinde geçerseniz null , bu doğrulanmamış kullanıcı olarak davranacaktır ( auth != null kuralları, örneğin başarısız olur).

Yerel testleri çalıştırın

Kullanım @firebase/rules-unit-testing olduğunu çalışır lokal emülatörü ile etkileştiği için modül. Eğer zaman aşımı veya alırsanız ECONNREFUSED hataları, emülatör aslında çalışmakta olduğunu bir kez daha kontrol.

Önemle kullanabilmesi node.js son sürümünü kullanmanızı öneririz async/await gösterimi. Test etmek isteyebileceğiniz davranışların neredeyse tamamı eşzamansız işlevleri içerir ve test modülü Promise tabanlı kodla çalışmak üzere tasarlanmıştır.

Gerçek Zamanlı Veritabanı öykünücüsü ile etkileşim kurma

Bir üretim Firebase Gerçek Zamanlı Veri Tabanı örneği bir alt etki erişilebilir firebaseio.com ve böyle DİNLENME api erişebilir:

https://<database_name>.firebaseio.com/path/to/my/data.json

Emülatör lokal olarak çalışır ve mevcuttur localhost:9000 . Belirli bir veritabanı örneği ile etkileşim için kullanmak zorunda olacak ns veritabanı adını belirtmek için sorgu parametresi.

http://localhost:9000/path/to/my/data.json?ns=<database_name>

SDK yöntemlerini test edin

Firebase Test SDK tarafından öykünücüyle arabirim oluşturmak için kullanılan yöntemleri görmek için bir ürün seçin.

Bulut Firestore

Bulut Firestore

initializeTestApp({ projectId: string, auth: Object }) => FirebaseApp

Bu yöntem, seçeneklerde belirtilen proje kimliğine ve yetkilendirme değişkenine karşılık gelen, başlatılmış bir Firebase uygulaması döndürür. Testlerde kullanmak üzere belirli bir kullanıcı olarak kimliği doğrulanmış bir uygulama oluşturmak için bunu kullanın.

firebase.initializeTestApp({
  projectId: "my-test-project",
  auth: { uid: "alice", email: "alice@example.com" }
});

initializeAdminApp({ projectId: string }) => FirebaseApp

Bu yöntem, başlatılmış bir yönetici Firebase uygulaması döndürür. Bu uygulama, okuma ve yazma işlemleri gerçekleştirirken güvenlik kurallarını atlar. Testlerin durumunu ayarlamak üzere yönetici olarak kimliği doğrulanmış bir uygulama oluşturmak için bunu kullanın.

firebase.initializeAdminApp({ projectId: "my-test-project" });
    

apps() => [FirebaseApp] Bu yöntem, döner olan tüm başlatıldı testi ve yönetici uygulamalar. Testler arasında veya sonrasında uygulamaları temizlemek için bunu kullanın.

Promise.all(firebase.apps().map(app => app.delete()))

loadFirestoreRules({ projectId: string, rules: Object }) => Promise

Bu yöntem, kuralları yerel olarak çalışan bir veritabanına gönderir. Kuralları dize olarak belirten bir nesne alır. Veritabanınızın kurallarını ayarlamak için bu yöntemi kullanın.

firebase.loadFirestoreRules({
  projectId: "my-test-project",
  rules: fs.readFileSync("/path/to/firestore.rules", "utf8")
});
    

assertFails(pr: Promise) => Promise

Bu yöntem, giriş başarılı olursa reddedilen veya giriş reddedilirse başarılı olan bir söz verir. Bir veritabanı okuma veya yazma işleminin başarısız olup olmadığını belirtmek için bunu kullanın.

firebase.assertFails(app.firestore().collection("private").doc("super-secret-document").get());
    

assertSucceeds(pr: Promise) => Promise

Bu yöntem, giriş başarılı olursa başarılı olan ve giriş reddedilirse reddedilen bir söz verir. Bir veritabanının okuma veya yazma işleminin başarılı olup olmadığını belirtmek için bunu kullanın.

firebase.assertSucceeds(app.firestore().collection("public").doc("test-document").get());
    

clearFirestoreData({ projectId: string }) => Promise

Bu yöntem, yerel olarak çalışan Firestore örneğinde belirli bir projeyle ilişkili tüm verileri temizler. Testlerden sonra temizlemek için bu yöntemi kullanın.

firebase.clearFirestoreData({
  projectId: "my-test-project"
});
   

Gerçek Zamanlı Veritabanı

Gerçek Zamanlı Veritabanı

initializeTestApp({ databaseName: string, auth: Object }) => FirebaseApp

Testlerde kullanmak üzere belirli bir kullanıcı olarak kimliği doğrulanmış bir uygulama oluşturmak için bunu kullanın.

Seçeneklerde belirtilen veritabanı adına ve yetkilendirme değişkeni geçersiz kılma işlemine karşılık gelen, başlatılmış bir firebase uygulaması döndürür.

firebase.initializeTestApp({
  databaseName: "my-database",
  auth: { uid: "alice" }
});

initializeAdminApp({ databaseName: string }) => FirebaseApp

Testler için durumu ayarlamak üzere yönetici olarak kimliği doğrulanmış bir uygulama oluşturmak için bunu kullanın.

Seçeneklerde belirtilen veritabanı adına karşılık gelen, başlatılmış bir yönetici firebase uygulaması döndürür. Bu uygulama, veritabanına okurken ve yazarken güvenlik kurallarını atlar.

firebase.initializeAdminApp({ databaseName: "my-database" });

loadDatabaseRules({ databaseName: string, rules: Object }) => Promise

Veritabanınızın kurallarını ayarlamak için bunu kullanın.

Kuralları yerel olarak çalışan bir veritabanına gönderir. "VeritabanıAdı"nızı ve "kurallarınızı" dizeler olarak belirten bir options nesnesi alır.

firebase
      .loadDatabaseRules({
        databaseName: "my-database",
        rules: "{'rules': {'.read': false, '.write': false}}"
      });

apps() => [FirebaseApp]

Şu anda başlatılmış tüm test ve yönetici uygulamalarını döndürür.

Testler arasında veya sonrasında uygulamaları temizlemek için bunu kullanın (etkin dinleyicilere sahip başlatılmış uygulamaların JavaScript'ten çıkmasını engellediğini unutmayın):

 Promise.all(firebase.apps().map(app => app.delete()))

assertFails(pr: Promise) => Promise

Giriş başarılı olursa reddedilen ve giriş reddedilirse başarılı olan bir söz verir.

Bir veritabanının okuma veya yazma işleminin başarısız olduğunu belirtmek için bunu kullanın:

firebase.assertFails(app.database().ref("secret").once("value"));

assertSucceeds(pr: Promise) => Promise

Giriş başarılı olursa başarılı olan ve giriş reddedilirse reddedilen bir söz verir.

Bir veritabanının okuma veya yazma işleminin başarılı olduğunu belirtmek için bunu kullanın:

firebase.assertSucceeds(app.database().ref("public").once("value"));

Bulut depolama

Bulut depolama

initializeTestApp({ storageBucket: string, auth: Object }) => FirebaseApp

Testlerde kullanmak üzere belirli bir kullanıcı olarak kimliği doğrulanmış bir uygulama oluşturmak için bunu kullanın.

Seçeneklerde belirtilen depolama paketi adına ve yetkilendirme değişkeni geçersiz kılmaya karşılık gelen, başlatılmış bir firebase uygulaması döndürür.

firebase.initializeTestApp({
  storageBucket: "my-bucket",
  auth: { uid: "alice" }
});

initializeAdminApp({ storageBucket: string }) => FirebaseApp

Testler için durumu ayarlamak üzere yönetici olarak kimliği doğrulanmış bir uygulama oluşturmak için bunu kullanın.

Seçeneklerde belirtilen depolama paketi adına karşılık gelen, başlatılmış bir yönetici firebase uygulaması döndürür. Bu uygulama, kovaya okurken ve yazarken güvenlik kurallarını atlar.

firebase.initializeAdminApp({ storageBucket: "my-bucket" });

loadStorageRules({ storageBucket: string, rules: Object }) => Promise

Depolama paketinizin kurallarını ayarlamak için bunu kullanın.

Kuralları yerel olarak yönetilen bir depolama paketine gönderir. "storageBucket" ve "kurallarınızı" dizeler olarak belirten bir options nesnesi alır.

firebase
      .loadStorageRules({
        storageBucket: "my-bucket",
        rules: fs.readFileSync("/path/to/storage.rules", "utf8")
      });

apps() => [FirebaseApp]

Şu anda başlatılmış tüm test ve yönetici uygulamalarını döndürür.

Testler arasında veya sonrasında uygulamaları temizlemek için bunu kullanın (etkin dinleyicilere sahip başlatılmış uygulamaların JavaScript'ten çıkmasını engellediğini unutmayın):

 Promise.all(firebase.apps().map(app => app.delete()))

assertFails(pr: Promise) => Promise

Giriş başarılı olursa reddedilen ve giriş reddedilirse başarılı olan bir söz verir.

Bir depolama paketinin okuma veya yazma işleminin başarısız olduğunu belirtmek için bunu kullanın:

firebase.assertFails(app.storage().ref("letters/private.doc").getMetadata());

assertSucceeds(pr: Promise) => Promise

Giriş başarılı olursa başarılı olan ve giriş reddedilirse reddedilen bir söz verir.

Bir depolama paketinin okuma veya yazma işleminin başarılı olduğunu belirtmek için bunu kullanın:

firebase.assertFails(app.storage().ref("images/cat.png").getMetadata());