在测试中实例化UIViewController

时间:2015-12-02 04:33:57

标签: ios swift testing

我在Swift 2中工作,想在我的视图控制器中测试函数。我已经创建了类似依赖注入的服务,如下所示:

// -1 means 0's turn
// 1 means X's turn

// AFTER EVERY MOVE
// UNTIL GAME OVER
// THIS NEEDS TO BE FLIPPED
// IF IT WAS 1, now it will be -1 and vice versa

var turn = 1;

// 0 means no move has been made yet 
// on that particular square
var grid = [
    [0, 0 ,0],
    [0, 0 ,0],
    [0, 0, 0]
];


function makeMove(row, column) {

    if (grid [row][column] == 0) {
        grid[row][column] = turn;

        var idOfSquareToChange = row +"" + column;

        if (turn == 1) {

            $("#"+idOfSquareToChange).html('X');
        }else {
            $("#"+idOfSquareToChange).html('O');
        }

        // CHECK IF GAME IS OVER

        // IF GAME ISN'T OVER   
        if (turn == 1) {
            turn = -1;
        }else {
            turn = 1;
        }
        printGrid();
    }else {
        alert('That square has been chosen');
    }
}

function printGrid(){

    var board = grid[0][0] + " " + grid [0][1] + " " + grid[0][2];
    board += "\n";
    board += grid[1][0] + " " + grid [1][1] + " " + grid[1][2];
    board += "\n";
    board += grid[2][0] + " " + grid [2][1] + " " + grid[2][2];

    alert(board);
}

function isGameOver() {
    // HERE IS WHERE OUR LOGIC WOULD GO
    // TO SEE IF SOMEONE won

}

有了这个,我可以将AppDelegate的上下文设置为用于测试目的的模拟。但是,当我尝试实例化视图控制器时出现问题。这是代码:

extension UIViewController: {
    func getDbService() -> IDbService {
        let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
        return DbService(context: context)
    }
}

我像这样实例化测试:

class LoginViewController: UIViewController {
    var token: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        let dbService = getDbService() 
        self.token = dbService.getToken() 
        //....do stuff with token 
    }
}

这个简单测试失败的原因是因为LoginViewController不知道app delegate是什么。有没有办法在初始化阶段引入它?

1 个答案:

答案 0 :(得分:0)

因此,使用默认控制器初始化视图控制器似乎不会获取我们在测试中设置的应用程序委托。相反,我通过故事板初始化了视图控制器:

let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let sut = storyboard.instantiateInitialViewController() as? LoginViewController
XCTAssertNotNil(sut)
XCTAssertNotNil(sut.view)
XCTAssertNotNil(sut.token)

解决了这个问题。