Write tests
When writing unit tests, you might want to stub the execution of commands to avoid running them in your tests. To ease that, Command uses the Mockable macro to provide a mock MockCommandRunning when the MOCKING Swift active compilation condition is set in your project.
Add Mockable as a dependency of your project, and set the MOCKING Swift active compilation condition when the targets compile with the Debug configuration.
Then you can use the mocks and the utilities from Mockable to stub the execution of commands in your tests:
swift
import XCTest
import Mockable
import Command
final class MySubjectTests: XCTestCase {
func test_some_logic() async throws {
// Given
let commandRunner = MockCommandRunning()
given(commandRunner)
.run(arguments: .value(["xcodebuild", "-project", "/path/to/Project.xcodeproj", "build"]), environment: .any, workingDirectory: .any)
.willReturn(AsyncThrowingStream<CommandEvent, any Error> { continuation in
continuation.yield(.standardOutput([UInt8]("first\n".utf8)))
continuation.yield(.standardOutput([UInt8]("second\n".utf8)))
continuation.finish()
})
let subject = Subject(commandRunner: commandRunner)
// When
let got = subject.run()
// Then
// ...expectations
}
}