로메오의 블로그

[DApp] 중복 투표 방지 테스트 코드 작성 본문

Backend/Python & Blockchain

[DApp] 중복 투표 방지 테스트 코드 작성

romeoh 2019. 7. 7. 19:16
반응형

[DAPP] 투표하기 테스트 코드 작성

위 포스트에 이어 계속 테스트코드를 작성합니다.

/test/election.spec.js

const Election = artifacts.require('./Election.sol')

contract('Election', accounts => {

    ....
    
    it('투표 유효성 검사', () => {
        return Election.deployed()
            .then(instance => {
                electionInstance = instance
                
                // 유효하지 않은 후보자에게 투표한다.
                return electionInstance.vote(99, {from: accounts[0]})
            })
            .then(assert.fail)
            .catch(error => {
                assert(error.message.indexOf('revert') >= 0, '유효하지 않은 후보자에게 투표하면 exception이 발생해야 한다.')
                
                // 1번 후보자를 반환한다.
                return electionInstance.candidates(1)
            })
            .then(candidate1 => {
                const voteCount = candidate1.voteCount.toNumber()
                assert.equal(voteCount, 1, 'exception 발생 이후 1번 후보자의 득표는 여전히 1 이어야 한다.')
                
                // 1번 후보자를 반환한다.
                return electionInstance.candidates(2)
            })
            .then(candidate1 => {
                const voteCount = candidate1.voteCount.toNumber()
                assert.equal(voteCount, 0, '2번 후보자의 득표수는 0이다.')
            })
    })
})

투표 유효성 검사에 대한 테스트 코드를 작성합니다.

 

테스트 코드 실행

$ truffle test

총 4개의 테스트가 통과 되었습니다.

 

이중 투표 방지 테스트 코드 작성

const Election = artifacts.require('./Election.sol')

contract('Election', accounts => {

    ....

    it('중복 투표를 방지한다.', () => {
        return Election.deployed()
            .then(instance => {
                electionInstance = instance

                // 2번 후보자에게 2번째 계정으로 투표한다.
                candidateId = 2
                electionInstance.vote(candidateId, {from: accounts[1]})

                // 2번 후보자를 반환한다.
                return electionInstance.candidates(candidateId)
            })
            .then(candidate2 => {
                const voteCount = candidate2.voteCount.toNumber()
                assert.equal(voteCount, 1, '첫 번째 투표는 정상적으로 작동해야한다.')

                // 같은 후보자에게 같은 계정으로 다시 투표한다.
                return electionInstance.vote(candidateId, {from: accounts[1]})
            })
            .then(assert.fail)
            .catch(error => {
                assert(error.message.indexOf('revert') >= 0, '같은 게정으로 투표할 수 없어야 한다.')
                
                // 1번 후보자를 반환한다.
                return electionInstance.candidates(1)
            })
            .then(candidate1 => {
                const voteCount = candidate1.voteCount.toNumber()
                assert.equal(voteCount, 1, '1번 후보자는 득표는 1 이 유지되고 있음')
                
                // 2번 후보자를 반환한다.
                return electionInstance.candidates(2)
            })
            .then(candidate2 => {
                const voteCount = candidate2.voteCount.toNumber()
                assert.equal(voteCount, 1, '2번 후보자의 득표는 1이다.')
            })
    })
})

이어서 테스트 코드를 작성합니다.

테스트 코드 실행

$ truffle test

5개의 테스트가 모두 통과 되었습니다.

 

전체 코드는 아래와 같습니다.

const Election = artifacts.require('./Election.sol')

contract('Election', accounts => {

    it('후보자 두 명 등록하면 candidatesCount는 2명 이다.', () => {
        return Election.deployed()
            .then(instance => {
                // 두명의 후보자를 등록합니다.
                instance.addCandidate('romeoh')
                instance.addCandidate('doraemong')
                
                // candidatesCount를 반환한다.
                return instance.candidatesCount()
            })
            .then(count => {
                // count는 2 다.
                assert.equal(count, 2)
            })
    })

    it('후보자 정보를 검증한다.', () => {
        return Election.deployed()
            .then(instance => {
                electionInstance = instance
                
                // 첫번째 후보자를 반환한다.
                // 위 테스트 코드에서 이미 두명의 후보자가 등록되어 있음
                return electionInstance.candidates(1)
            })
            .then(candidate => {
                assert.equal(candidate[0], 1, '첫번째 후보자 기호는 1번이다.')
                assert.equal(candidate[1], 'romeoh', '첫번째 후보자 이름은 romeoh다.')
                assert.equal(candidate[2], 0, '첫번째 후보자 득표는 0 이다.')
                
                // 두번째 후보자를 반환한다.
                return electionInstance.candidates(2)
            })
            .then(candidate => {
                assert.equal(candidate[0], 2, '두번째 후보자 기호는 2번이다.')
                assert.equal(candidate[1], 'doraemong', '두번째 후보자 이름은 doraemong이다.')
                assert.equal(candidate[2], 0, '두번째 후보자 득표는 0 이다.')
            })
    })

    it('투표하기', () => {
        return Election.deployed()
            .then(instance => {
                electionInstance = instance
                candidateId = 1
                
                // 1번 후보자에게 투표함
                return electionInstance.vote(candidateId, {from: accounts[0]})
            })
            .then(() => {
                // account[0] 계정 주소를 반환함
                return electionInstance.voters(accounts[0])
            })
            .then(voted => {
                assert(voted, 'account[0]의 계정 주소가 투표한 것을 확인한다.')
                
                // 1번 후보자를 반환함
                return electionInstance.candidates(candidateId)
            })
            .then(candidate => {
                const voteCount = candidate.voteCount.toNumber()
                assert(voteCount, 1, '1번 후보자의 득표는 1 이다.')
            })
    })

    it('투표 유효성 검사', () => {
        return Election.deployed()
            .then(instance => {
                electionInstance = instance

                // 유효하지 않은 후보자에게 투표한다.
                return electionInstance.vote(99, {from: accounts[0]})
            })
            .then(assert.fail)
            .catch(error => {
                assert(error.message.indexOf('revert') >= 0, '유효하지 않은 후보자에게 투표하면 exception이 발생해야 한다.')
                
                // 1번 후보자를 반환한다.
                return electionInstance.candidates(1)
            })
            .then(candidate1 => {
                const voteCount = candidate1.voteCount.toNumber()
                assert.equal(voteCount, 1, 'exception 발생 이후 1번 후보자의 득표는 여전히 1 이어야 한다.')
                
                // 1번 후보자를 반환한다.
                return electionInstance.candidates(2)
            })
            .then(candidate1 => {
                const voteCount = candidate1.voteCount.toNumber()
                assert.equal(voteCount, 0, '2번 후보자의 득표수는 0이다.')
            })
    })

    it('중복 투표를 방지한다.', () => {
        return Election.deployed()
            .then(instance => {
                electionInstance = instance

                // 2번 후보자에게 2번째 계정으로 투표한다.
                candidateId = 2
                electionInstance.vote(candidateId, {from: accounts[1]})

                // 2번 후보자를 반환한다.
                return electionInstance.candidates(candidateId)
            })
            .then(candidate2 => {
                const voteCount = candidate2.voteCount.toNumber()
                assert.equal(voteCount, 1, '첫 번째 투표는 정상적으로 작동해야한다.')

                // 같은 후보자에게 같은 계정으로 다시 투표한다.
                return electionInstance.vote(candidateId, {from: accounts[1]})
            })
            .then(assert.fail)
            .catch(error => {
                assert(error.message.indexOf('revert') >= 0, '같은 게정으로 투표할 수 없어야 한다.')
                
                // 1번 후보자를 반환한다.
                return electionInstance.candidates(1)
            })
            .then(candidate1 => {
                const voteCount = candidate1.voteCount.toNumber()
                assert.equal(voteCount, 1, '1번 후보자는 득표는 1 이 유지되고 있음')
                
                // 2번 후보자를 반환한다.
                return electionInstance.candidates(2)
            })
            .then(candidate2 => {
                const voteCount = candidate2.voteCount.toNumber()
                assert.equal(voteCount, 1, '2번 후보자의 득표는 1이다.')
            })
    })
})
반응형

'Backend > Python & Blockchain' 카테고리의 다른 글

[DApp] Watch Event Listener  (2) 2019.07.08
[DApp] 투표하기 화면 구현  (1) 2019.07.07
[DApp] 중복 투표 방지하기  (0) 2019.07.07
[DApp] 투표하기 테스트 코드 작성  (0) 2019.07.07
[DApp] 투표하기 구현  (0) 2019.07.07
Comments