0

ลองใช้ jasmine-node เถื่อน ๆ :-P

ผมไปทำ spec ไว้ใน tests/spec/foo_spec.js ไม่ได้สื่ออะไรเลย

var subj = require(‘../../subj.js’);
describe(‘foo suite’, function() {
var subj_ = new subj.Subj();
it("do sth", function() {
expect(subj_.x).toBe(100);
});
});

แล้วก็ถามด้วยสิ่งที่จะโดน test

exports.Subj = Subj;
function Subj() {
this.x = 100;
}

ลง jasmine-node ด้วย

sudo npm install -g jasmine-node

เวลา test ก็สั่ง

jasmine-node tests

(tests นี่คือชื่อ folder นะ)

เป็นอันใช้ได้ แต่กว่าจะใช้ได้ก็ต้องมั่วอยู่สักพักอะนะ

แย่หน่อยผมไม่รู้อะไรเกี่ยวกับ BDD เลย แต่เห็น AngularJS มันใช้ตัวนี้ก็เลยใช้ตาม :-P

0

เขียน matcher ใน mockito

ผมอยากจะทำอะไรแบบ

verify(myObject).myMethod(new int[][] { new int[] {2,3}, new int[] {1}});

คือจะ verify โดย parameter เป็น array 2 มิติ มันเจ๊งเพราะปกติ Mockito มันไปเรียน Arrays.equals ผมอยากจะให้มันเปรียบเทียบแบบลึกๆ คือใช้ Arrays.deepEquals แทน แต่ว่าเปลี่ยนที่ไหน? … ผมหาใน API หาไม่เจอ (มันอาจจะมีเพียงแต่หาไม่เจอ) เลยดูตัวอย่างจาก AdditionalMatcher แล้วเขียนตาม ได้แบบนี้

import java.util.Arrays;
import org.mockito.ArgumentMatcher;
import org.mockito.internal.matchers.ArrayEquals;
import org.mockito.internal.progress.HandyReturnValues;
import org.mockito.internal.progress.MockingProgress;
import org.mockito.internal.progress.ThreadSafeMockingProgress;

class DeepArrayEquals extends ArrayEquals {
	public DeepArrayEquals(Object wanted) {
		super(wanted);
	}

	@Override
	public boolean matches(Object actual) {
		Object wanted = getWanted();
		return Arrays.deepEquals((int[][]) wanted, (int[][]) actual);
	}
}

class CustomizedMatcher {
	private static MockingProgress mockingProgress = new ThreadSafeMockingProgress();

	private static HandyReturnValues reportMatcher(ArgumentMatcher matcher) {
		return mockingProgress.getArgumentMatcherStorage().reportMatcher(
				matcher);
	}

	public static int[][] ary2d(int[][] ary) {
		return reportMatcher(new DeepArrayEquals(ary)).returnNull();
	}
}

เวลาใช้ก็ใช้แบบนี้

verify(myObject).myMethod(CustomizedMatcher.ary2d(new int[][] { new int[] {2,3}, new int[] {1}}));

เอาไปครอบๆ ไว้เป็นอันใช้ได้

1

Mockito: when … thenReturn แบบปริยาย และมีข้อยกเว้น

ผมอยากเขียน mock แบบได้ค่าอะไรมาก็ตามก็ให้ return 30; ไป แต่ถ้ารับ 20 มาให้ return 20; ไปก็เลยมาลองๆ ทำดูมั่วๆ ใช้ไม่ค่อยเป็นด้วย

package funfun;
import static org.mockito.Mockito.*;

public class Moki {
	public int foo(int x) {
		return 10;
	}

	public static void main(String[] args) {
		Moki ki = mock(Moki.class);
		when(ki.foo(anyInt())).thenReturn(30); // ปริยาย
		when(ki.foo(20)).thenReturn(20); // ยกเว้น
		System.out.println(ki.foo(20));
		System.out.println(ki.foo(30));
	}
}

ก็เลยเขียนได้ความแบบข้างบน พบว่าต้องเอาค่าปริยายขึ้นก่อน แล้วข้อยกเว้นตามทีหลัง