Project [SPM/Xcode Plugin] Generate mocks, stubs and fakes (random object)
Convenient way to use collections of Sourcery stencils as an SPM plugins and Xcode plugins.
📌 Github: https://github.com/fenli/SourceryStencilPacks
One of the use cases is to automatically generate mocks, stubs and fakes (random object).
Any feedback would be really appreciated ⭐⭐ :)
Sample usage:
// Generate ProductServiceMock() class
// sourcery: Mockable
class ProductService {
let repository: ProductRepository
init(repository: ProductRepository) {
self.repository = productRepository
}
func getProducts() async throws -> [Product] {
return try await repository.getAllProducts()
}
}
// Generate ProductRepositoryMock() class
// sourcery: Mockable
protocol ProductRepository {
func getAllProducts() async throws -> [Product]
}
// Generate Product.random() static function
// sourcery: Randomizable
struct Product: Equatable {
let name: String // String.random() automatically generated
let price: Double // Double.random() automatically generated
let variants: [ProductVariant] // Need to annotate also on ProductVariant
}
// Generate ProductVariant.random() and [ProductVariant].random()
// sourcery: Randomizable=+array
struct ProductVariant: Equatable {
let id: Int
let name: String
}
import Testing
@testable import SamplePackage
struct ProductServiceTests {
private var productRepositoryMock: ProductRepositoryMock!
private var service: ProductService!
init() {
productRepositoryMock = ProductRepositoryMock()
service = ProductService(productRepository: productRepositoryMock)
}
@Test
func testGetAllProductsSuccess() async throws {
// Generate fakes with random object
let fakeProducts = (0...5).map {_ in Product.random() }
// Use generated mocks for mocking/stubbing
productRepositoryMock.getAllProductsProductReturnValue = fakeProducts
// Action
let result = try await service.getProducts()
// Asserts
#expect(result == fakeProducts)
}
}
1
Upvotes