Обычно вы хотите использовать Mock Object, когда вы хотите делегировать некоторые функциональные возможности другому объекту, но вы не хотите проверять реальную функциональность вашего текущего теста, поэтому вы заменяете этот объект другим, которым легче управлять.Давайте назовем этот объект «зависимостью» ...
То, что вы тестируете (объект / метод / функция ...), может взаимодействовать с этой зависимостью, вызывая методы для ...
- Запрос чего-либо.
- Изменение чего-либо или создание какого-либо побочного эффекта.
При вызове метода для запроса чего-либо
Когда вы используете зависимостьчтобы «запросить» что-то, вам не нужно использовать «фиктивный API», потому что вы можете просто использовать обычный объект и проверить ожидаемый результат в тестируемом объекте ... например:
describe "Books catalog" do
class FakeDB
def initialize(books:)
@books = books
end
def fetch_books
@books
end
end
it "has the stored books" do
db = FakeDB.new(books: ["Principito"])
catalog = BooksCatalog.new(db)
expect(catalog.books).to eq ["Principito"]
end
end
При вызове метода для изменения чего-либо или создания какого-либо побочного эффекта ...
Когда вы хотите изменить свою зависимость или сделать что-то с побочными эффектами, такими как вставка новой записи вбаза данных, отправка электронного письма, внесение платежа и т. д. ... теперь вместо того, чтобы проверять, было ли произведено изменение или побочный эффект, вы просто проверяете, что вызываете правильную функцию / метод с правильными атрибутами ... for пример:
describe "Books catalog" do
class FakeDB
def self.insert(book)
end
end
def db
FakeDB
end
it "stores new added books" do
catalog = BooksCatalog.new(db)
# This is how you can use the Mock API of rspec
expect(db).to receive(:insert).with("Harry Potter")
catalog.add_book("Harry Potter")
end
end
Это базовый пример, но вы можете многое сделать, просто используя эти знания =)
Я написал пост с этим содержанием и еще немногочто может быть полезно http://bhserna.com/2018/how-and-when-to-use-mock-objects-with-ruby-and-rspec.html