Giriş

Serimizin ilk bölümünde CosmWasm ortamını ve CosmWasm sözleşmesinin mimarisini kurmayı araştırdık. İkinci bölümde proje kurma süreci anlatıldı.
Üçüncüsünde, ana iş mantığını ve eyaletlerdeki değerleri hesaplamak ve depolamak için kullanılan işlevleri tartıştık. Bu serinin dördüncü ve son bölümünde, şimdiye kadar öğrendiklerimize uygulayarak birim ve entegrasyon testi yapacağız. Ayrıca, tüm prosedürü anlamamızı değerlendirmek için birkaç işlev deneyeceğiz.

Ayrıca bu seride:
Cudos ağında akıllı bir sözleşme oluşturun: Bölüm 1: hazırlık, Bölüm 2: bir proje ayarlayın, Bölüm 3: Ana iş mantığı.

Test

Rust, bir proje içindeki tüm birim ve entegrasyon testlerini yapabileceğiniz mükemmel bir işlevsellik sağladı. Bu şekilde, test için başka bir ortam ayarlamanız gerekmez.

#[cfg(test)]
mod testleri {
super::* kullanın;
cosmwasm_std::sınama::{mock_dependencies, mock_env, mock_info};
cosmwasm_std::{coin, StdError} kullanın;
…..
}

  • Super::* kullanın, bu projede kullanılan tüm libs’leri içe aktarır
  • use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info}: burada test için gereken DEPS, ENV ve bilgi alayları alırsınız
  • Doğruca teste gidelim.

do_instantiate

A. İlk olarak, sözleşmeyi bizim için başarıyla dağıtacak bir işlev oluşturun, böylece sizin için bir sözleşme dağıtabilecek bir işlev do_instantiate ihtiyacınız vardır.

B. Params:

  • Deps: depolama, miktar ve naneye erişebilmeniz için deps’in kesilebilir nesnesi
  • Toplayıcı: ilk bakiyeyi atadığınız kişi
  • Tutar: Addr’a CW20 belirteçlerinin miktarı
  • Sahibi: Sözleşmenin sahibi ve aynı zamanda minter olarak hareket eder. Minter yalnızca CW20 belirteçlerini diğer adreslere basmaktan sorumludur.

C. Burada bir InstantiateMsg’e ihtiyacınız var.

D. Bundan sonra, sözleşmenin örneğini yapacak arayanla alay etmeniz gerekir, bu nedenle bunun için ilk param olarak sahibi koyduğunuz
mock_info
kullanın. Bazı yerel coin’leri geçirmeniz gerekiyorsa, bir dizi Coin eklemelisiniz

ikinci parametre olarak.

E. Mock_env

yükseklik, zaman vb.

F. Ben sadece tüm parametrelerle örnekleme işlevini çağırıyorum.

G. Response::d efault() sıfır uzunlukta yanıt nesnesi vereceğinden yanıt uzunluğunu 0 ile onaylıyorum

H. Sözleşmedeki veri depolamayı onaylamak için query_token_info() öğesini arayın.

I. Alıcının ilk bakiyeyi alıp almadığını kontrol etmek için getBalance() öğesini arayın.

J. Sözleşmenin sahibinin minter olup olmadığını doğrulamak için query_minter arayın.

fn do_instantiate(
mut deps: DepsMut,
toplayıcı: &str,
tutar: Uint128,
sahibi: &str,
) – > TokenInfoResponse {
let instantiate_msg = InstantiateMsg {
adı: “Otomatik Gen”.to_string(),
sembol: “OTOMATİk”.to_string(),
ondalık basamak: 3,
initial_balances: vec! [Cw20Coin {
adres: addr.to_string(),
miktar
}],
};
bilgi = mock_info(sahip, &[]);
let env = mock_env();
let res = instantiate(deps.branch(), env, info, instantiate_msg).unwrap();
assert_eq! (0, res.messages.len());

let meta = query_token_info(deps.as_ref()).unwrap();
assert_eq! (
Meta
TokenInfoResponse {
adı: “Otomatik Gen”.to_string(),
sembol: “OTOMATİk”.to_string(),
ondalık basamak: 3,
total_supply: tutar,
}
);
assert_eq! (get_balance(deps.as_ref(), toplayıcı), tutar);
assert_eq! (query_minter(deps.as_ref()).unwrap(), sahibi);
Meta
}

Can_mint_by_minter

A. can_mint_by_minter test çalışması, yalnızca bir minter’in diğer adreslere yeni belirteçler basabilmesini sağladı.

B. Doğrudan test çalışmalarına geçelim.

C. Herhangi bir işlevi pas içinde bir test çalışması olarak işaretlemek için, bu işlevin üzerine # [test] eklemeniz gerekir

D. Genellikle, geliştiriciler belirli bir işlevle ilgili tüm pozitif ve negatif test çalışmalarını aynı test çalışmalarının içine yazar. Bu nedenle, yorumları (//) kullanarak test çalışmalarını ayırmanız gerekir.

E. İlk olarak, Blockchain tarafından sağlanan depolama, API ve querier içerdiğinden deps nesnesiyle alay etmeniz gerekir; bu mock_depenndencies()

kullanılarakyapılır.

F. Sonra için birkaç değişken oluşturdu

ben. alıcı: ilk bakiyenin bir parçası olarak belirteçleri kim alacak

ıı. miktar: alıcının ilk bakiyenin bir parçası olarak kaç jeton aldığı

ııı. sahip: sözleşmeyi dağıtır ve minter olan adres

ıv. galip: sahibinin belirteçleri basacağı adres

v. ödül: sahibinin kazanana vereceği CW20 jeton miktarı

G. İlk test çalışması: Jetonların sahibi tarafından kazanana başarılı bir şekilde basılmış olması

ben. Hedef Mint işlevini çağırın, bir ExecuteMsg::Mint nesnesi oluşturmanız gerekir.

ii. Arayanla sahip adresi olarak alay etmeye mock_info.

ııı. mock_env blockchain ile alay etmek

ıv. İlk adımda oluşturulan executeMsg çalıştırmak için execute yöntemini kullanın ve unwrap bir None aldığında panik döndürür.

v. getBalance() kullanarak Kazananın bakiyesini kontrol edin. Denge ödüle eşitse, Mint fonksiyonumuz doğru çalışıyor demektir.

H. İkinci test çalışması: Diğerleri nane yapamaz

ben. Hedef Mint işlevini çağırın, bir ExecuteMsg::Mint nesnesi oluşturmanız gerekir.

ıı. mock_info başka adreslerle alay etmek için. Bunun için arayan olarak “başka biri” kullanın

ııı. Blockchain ile alay etmek mock_env.

ıv. İlk adımda oluşturulan executeMsg’i çalıştırmak ve bir hata iletisi döndürmek unwrap_err execute yöntemini kullanın.

v. ContractError işlevinden alınan hata iletisini onaylama: Yetkisiz

I. Üçüncü Test çalışması: hatayı bir miktar kadar sıfırı geçirin

ben. Hedef Mint işlevini çağırın, bir ExecuteMsg oluşturmanız gerekir::Nane nesnesi miktarı sıfır olarak.

ıı. Mock_info arayan olarak sahibiyle alay etmek için

ııı. Blockchain ile alay etmek mock_env

ıv. İlk adımda oluşturulan executeMsg’i çalıştırmak ve bir hata iletisi döndürmek unwrap_err execute yöntemini kullanın.

v. ContractError::InvalidZeroAmount işlevinden alınan hata iletisini onayla

#[test]
fn can_mint_by_minter() {
bırak mut deps = mock_dependencies(&[]);

let recipient = String::from(“alıcı”);
tutara izin ver = Uint128::new(11223344);
let owner = String::from(“asmodat”);
do_instantiate(deps.as_mut(), & alıcı, tutar ve sahip);
let winner = String::from(“şanslı”);
let ödülü = Uint128::new(222_222_222);
let msg = ExecuteMsg::Nane {
alıcı: winner.clone(),
miktar: ödül,
};

belirteçlerin sahibi tarafından kazanana başarılı bir şekilde basılmış
bilgi = mock_info(owner.as_ref(), &[]);
let env = mock_env();
let res = execute(deps.as_mut(), env, info, msg).unwrap();

assert_eq! (0, res.messages.len());
assert_eq! (get_balance(deps.as_ref(), alıcı), tutar);
assert_eq! (get_balance(deps.as_ref(), winner.clone()), ödül);

Diğerleri nane yapamaz
let msg = ExecuteMsg::Nane {
alıcı: Dize::from(“şanslı”),
tutar: Uint128::yeni(222),
};
let info = mock_info(“başka biri”, &[]);
let env = mock_env();
let err = execute(deps.as_mut(), env, info, msg).unwrap_err();
assert_eq! (hata, ContractError::Yetkisiz {});

hatayı bir miktar olarak sıfır ilet
let msg = ExecuteMsg::Nane {
alıcı: winner.clone(),
tutar: Uint128::zero(),
};
bilgi = mock_info(owner.as_ref(), &[]);
let env = mock_env();
let err = execute(deps.as_mut(), env, info, msg).unwrap_err();
assert_eq! (hata, ContractError::InvalidZeroAmount {});
}

Ödev

Bundan sonra, yukarıdaki kodu ve CW-plus’ı örnek alarak birkaç işlev oluşturmanızı istiyorum:

  • DistributRewards()
  • Tüm paydaşlara ödül dağıtın
  • Ödüller günlük olarak hesaplanır
  • Kullanıcılar bu işlevi çağırdıktan sonra, ödüller her paydaşa dağıtılır
  • Bu işlevi yalnızca minter adresi çağırabilir
  • WithdrawRewards()
  • Arayan ödülünü geri çekebilir, bahis değil.
  • StakeAndRewardOf(hesap):
  • Belirli bir hesabın bahislerini ve ödüllerini görüntüleme
  • Toplam Alım:
  • Toplam kazığı göster.

Şu anda ne yapabilirsin?

Aşağıdaki bağlantıları izleyerek teşvik edilen testnet Project Artemis’imize katılarak hemen dahil olabilirsiniz:

Özellikle, test ceninin bir parçası olarak tamamlayacağınız görevlere göre ödüller alacaksınız.

Not: CUDOS jetonlarınızızaten satın aldıysanız, ağın güvenliğini sağlamak ve karşılığında ödüller almak için platformumuza göz kırparak bunlardan en iyi şekilde emin olabilirsiniz.

Cudos Hakkında

Cudos Network, yüksek performanslı bilgi işleme uygun ölçekte merkezi olmayan, izinsiz erişim sağlamak için tasarlanmış katman 1 blok zinciri ve katman 2 hesaplama ve oracle ağıdır. Bilgi işlem kaynaklarının yüz binlerce düğüme ölçeklendirmesini sağlar. Ethereum, Algorand, Polkadot ve Cosmos’a köprü kurulduktan sonra Cudos, tüm köprülenmiş blok zincirlerinde ölçeklenebilir hesaplamalı ve katman iki kahinlere olanak sağlayacak.

Daha fazla bilgi edinin:
Web Sitesi, Heyecan, Telgraf, YouTube, Ahenksizlik, Orta