문제 풀기 Test 코드

Lumi·2021년 12월 8일
0
post-thumbnail
const coinToFlip = artifacts.require("CoinToFlip");

contract("CoinToFlip", function (accounts) {
  let instance;
  
  beforeEach(async () => {
    instance = await coinToFlip.new();
  });

  //컨트랙트 배포자가 아니면 kill() 메소드가 실행되어서는 안된다.
  it("self-destruct should be executed by ONLY owner", async () => {
    try {
      await instance.kill({ from: accounts[9] }); //error가 정상
      // 컨트랙트 배포자는 0이기 떄문이 0 이 아닌 값을 통해서 에러가 나면 정상으로 취급을 하는 것이다.
    } catch (e) {
      var err = e;
    }
    assert.isOk(err instanceof Error, "Anyone can kill the contract!");
    // err이라는 변수가 Error의 형태라면 참이고 아니면 잘못되었다는 의미가 된다.
  });

  //컨트랙트에 5 ETH를 전송하면 컨트랙트의 잔액은 5 ETH가 되어야 한다.
  it("should have initial fund", async () => {
    await instance.sendTransaction({
      from: accounts[9],
      value: web3.utils.toWei("5", "ether"),
    });

    let bal = await web3.eth.getBalance(instance.address);
    assert.equal(
      web3.utils.fromWei(bal, "ether").toString(),
      "5",
      "House does not have enough fund"
    );
  });

  //0.1 ETH를 베팅하면 컨트랙트의 잔액은 (     ) ETH가 되어야 한다.
  it("should have normal bet", async () => {

    const val = 0.1;
    const mask = 1; //Tails 0000 0001

    await instance.placeBet(mask, {
      from: accounts[3],
      value: web3.utils.toWei(val.toString(), "ether"),
    });
    let bal = await web3.eth.getBalance(instance.address);
    assert.equal(
      await web3.utils.fromWei(bal, "ether").toString(),
      "5.1",
      "placeBet is failed"
    );
  });

  //플레이어는 베팅을 연속해서 두 번 할 수 없다(베팅한 후에는 항상 결과를 확인해야 한다).
  it("should have only one bet at a time", async () => {

    const val = 0.1;
    const mask = 1; //Tails 0000 0001

    try {
      await instance.placeBet(mask, {
        from: accounts[3],
        value: web3.utils.toWei(val.toString(), "ether"),
      });
      // 이 부분도 에러가 나야 정상이 된다.
    } catch (error) {
      var err = error;
    }
    assert.isOk(err instanceof Error, "Player can bet more than two");
  });
});

크립토 좀비를 통해서 beforeEach를 알고 있기 떄문에 제 남들대로 코드를 살짝 수정하였습니다.

일단 저희가 크게 테스트 해야 하는 부분은 총 4가지가 있습니다.

  • 사용자가 원하면 더 많은 테스트를 할 수도 있습니다.
[1] 오직 관리자만이 Kill()메서드를 실행 가능하다.

[2] 컨트랙트에 5이더를 전송하면 컨트랙트의 잔액은 5이더가 되어야 한다.

[3] 0.1이더를 배티하면 컨트랙트의 잔액은 기존의 잔액에 0.1이더를 더한 값 이어야 한다.

[4] 플레이어의 베팅은 단 한번만 가능하다.

test케이스를 돌리기 위해서는 일단 it이라는 곳에서 시작을 하게 됩니다.

  • 이떄 반드시 async, await를 활용 해야 합니다.

🔥 [1] 테스트

it("self-destruct should be executed by ONLY owner", async () => {
    try {
      await instance.kill({ from: accounts[9] }); //error가 정상
      // 컨트랙트 배포자는 0이기 떄문이 0 이 아닌 값을 통해서 에러가 나면 정상으로 취급을 하는 것이다.
    } catch (e) {
      var err = e;
    }
    assert.isOk(err instanceof Error, "Anyone can kill the contract!");
    // err이라는 변수가 Error의 형태라면 참이고 아니면 잘못되었다는 의미가 된다.
  });

일부러 오류를 발생시키는 코드입니다.

컨트랙트 배포자의 계정은 반드시 0이되기 때문에 일부러 9의 값을 주어서 배포를 시켰고

isOk라는 값을 통해서 err이라는 변수에 에러값이 들어가있으면 통과라는 코드입니다.

🔥 [2] 테스트

it("should have initial fund", async () => {
    await instance.sendTransaction({
      from: accounts[9],
      value: web3.utils.toWei("5", "ether"),
    });

    let bal = await web3.eth.getBalance(instance.address);
    assert.equal(
      web3.utils.fromWei(bal, "ether").toString(),
      "5",
      "House does not have enough fund"
    );
  });

전송이 정상적으로 이루어 지는지를 확인하는 코드 입니다.

보통은 솔리디티에 있는 함수를 사용하여야 하지만 트랜잭션을 보내는 함수는 내장함수와 비슷한 의미로 선언되어 있지 않아도 필요할떄 사용 가능합니다.

Ganache에 연결을 하였기 떄문에 9번 계정에서 컨트랙트 내부로 5의 이더를 전송하게 됩니다.

이후 컨트랙트 계정의 주소를 대입하여 해당 값에 5가 들어가 있으면 테스트는 통과가 됩니다.

이떄 비교를 쉽게 하기 위해 이더로 바꿔줍니다.

🔥 [3] 테스트

it("should have normal bet", async () => {

    const val = 0.1;
    const mask = 1; //Tails 0000 0001

    await instance.placeBet(mask, {
      from: accounts[3],
      value: web3.utils.toWei(val.toString(), "ether"),
    });
    let bal = await web3.eth.getBalance(instance.address);
    assert.equal(
      await web3.utils.fromWei(bal, "ether").toString(),
      "5.1",
      "placeBet is failed"
    );
  });

배팅이 정상적으로 이루어 지는지를 확인하는 코드입니다.

3번 계정에서 컨트랙트로 0.1 이더를 배팅을 하게 되고 전송을 할떄에는 wei로 전송을 하게 됩니다.

이후 해당 컨트랙트에 2번에서 보낸 5이더와 이번에 보낸 0.1이더를 더한 5.1이더가 정상적으로 있는지를 확인합니다.

🔥 [4] 테스트

 it("should have only one bet at a time", async () => {

    const val = 0.1;
    const mask = 1; //Tails 0000 0001

    try {
      await instance.placeBet(mask, {
        from: accounts[3],
        value: web3.utils.toWei(val.toString(), "ether"),
      });
      // 이 부분도 에러가 나야 정상이 된다.
    } catch (error) {
      var err = error;
    }
    assert.isOk(err instanceof Error, "Player can bet more than two");
  });

연속 배팅을 확인하는 테스트 입니다.

3번 테스트에서 3번 계정은 이미 0.1이더를 전송을 하였기 때문에 만약 다시 전송을 하게 되면 에러가 발생을 하게 됩니다.

그후 [1]번 테스트와 같은 방법으로 에러를 확인하게 됩니다.

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글