I have implemented an Observer pattern to observe the changes in the view controller.
So it has one list of objects when I am updating the list count should increase by one it is increasing in the actual code but when i am unit testing test case is failing i am not able to understand why.
I have try with expectations but it is always failing.
class ConversationViewModel: ConversationViewModelProtocol {
var messages: Observable<[Message]> = Observable([])
var follower: FollowerListItemViewModel
var userName: String = “”
private var conversationRepository: ConversationRepositoryProtocol
init(userName: String, follower: FollowerListItemViewModel, conversationRepository: ConversationRepositoryProtocol) {
self.follower = follower
self.userName = userName
self.conversationRepository = conversationRepository
bindObserver()
}
func bindObserver() {
conversationRepository.messages.observe(on: self) { messages in
self.updateMessageObserver(message: messages)
}
}
func sendMessage(messagebody: String) {
let message = Message(message: messagebody, messageTo: follower.followerName,
messageFrom: userName, direction: .outgoing)
updateMessageObserver(message: [message])
conversationRepository.sendMessage(message: message) { _ in
// update check box when message send complition response we received
}
}
private func updateMessageObserver(message: [Message]) {
messages.value.append(contentsOf: message)
print(“Message Count (messages.value.count)”)
}
}
func test_ReceiveMessage() throws {
let messageString = “hai”
let follwerName = “Jain”
let imagePath = “imagePath”
let followerListViewModel = FollowerListItemViewModel(followerName: follwerName, userImagePath: imagePath)
let mockConversationRepository = MockConversationRespositroy()
// mockConversationRepository.expectation = expectation(description: "Waiting for result to uptdate")
let userName = "Madhur"
let viewModel = ConversationViewModel(userName: userName,
follower: followerListViewModel,
conversationRepository: mockConversationRepository)
let message = Message(message: messageString,
messageTo: followerListViewModel.followerName,
messageFrom: userName,
direction: .outgoing)
viewModel.sendMessage(messagebody: messageString)
XCTAssertEqual(viewModel.messages.value.count, 1)
XCTAssertEqual(viewModel.messages.value[0], message)
}
}
class MockConversationRespositroy: ConversationRepositoryProtocol {
var messages: Observable<[Message]> = Observable([])
var expectation: XCTestExpectation?
var error: Error?
func sendMessage(message: Message, completion: @escaping (Result<Void, Error>) → Void) {
self.messages.value = [message]
if let error = error {
completion(.failure(error))
} else {
completion(.success(()))
}
//expectation?.fulfill()
}
}