npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@defi-wonderland/smock-foundry

v1.5.0

Published

Smock-style mocks for Foundry projects

Downloads

518

Readme

Version License: MIT

Smock Foundry

A plugin for foundry that automatically generates Solidity mocks for every contract in your project.

Features

  • Get rid of your folder of "mock" contracts and just use foundry.
  • Keep your tests simple with straightforward mock functions.
  • Mock up external calls and internal variables in a beautiful and orderly fashion.

Installation

You can install the plugin via yarn:

yarn add @defi-wonderland/smock-foundry --save-dev

Basic Usage

Creating mocks

To generate the mock contracts all you have to do is run:

yarn smock-foundry --contracts solidity/contracts

The smock-foundry command accepts the following options:

| Option | Default | Notes | | ----------- | -------------- | ---------------------------------------------------------- | | contracts | — | The path to the solidity contracts to mock | | root | . | The path to the root of the project | | mocks | ./test/smock | The path to the generated mock contracts | | ignore | [] | A list of directories to ignore, e.g. --ignore libraries |

Be sure to gitignore the generated smock directory.

Using mocks

Let's say you have a Greeter contract in your project at contracts/Greeter.sol:

contract Greeter {
  string internal _greeting;

  constructor(string memory greeting) {
    _greeting = greeting;
  }

  function greet() public view returns (string memory) {
    return _greeting;
  }
}

After running the generator, you will have a mock contract located at ${mocks}/contracts/MockGreeter.sol:

contract MockGreeter is Greeter {
  function mock_call_greet(string memory __greeting) external {
    // Mocks the greet() function calls
  }

  function set__greeting(string memory greeting) public {
    // Sets the value of `greeting`
  }
}

The next step would be importing the mock contract in your unit tests, deploying it and allowing it to use the cheatcodes, specifically vm.mockCall.

import 'forge-std/Test.sol';

import { MockGreeter } from '/path/to/smock/contracts/MockGreeter.sol';
import { SmockHelper } from '/path/to/smock/SmockHelper.sol';

contract BaseTest is Test, SmockHelper {
  MockGreeter public greeter;

  function setUp() public {
    // The `deployMock` call is equivalent to
    // address _greeterAddress = address(new MockGreeter('Hello'));
    // vm.label(_greeterAddress, 'Greeter');
    // vm.allowCheatcodes(_greeterAddress);
    // return _greeterAddress;

    greeter = MockGreeter(
      deployMock('Greeter', type(Greeter).creationCode, abi.encode('Hello'))
    );
  }
}

Then enjoy the wonders of mocking:

// Mock the `greet` function to return 'Hola' instead of 'Hello'
greeter.mock_call_greet('Hola');

// Or you can achieve the same by setting the internal variable
greeter.set__greeting('Hola');

Gotchas

  • Please, note that if you want to mock internal functions, you must make them virtual. The tool will not generate mocks for internal functions that are not virtual.
  • Cannot set private variables and mock private functions.
  • Mocking of structs containing mappings is not supported.
  • Mocking of multi-dimensional arrays of structs is not supported.

Licensing

The primary license for Smock Foundry is MIT, see LICENSE.

Contributors

Maintained with love by Wonderland. Made possible by viewers like you.