
Unit Test Vue Pinia
OfficialFreeEfficiently write and review unit tests for Vue 3 applications.
Free · Opens the source repo
What Unit Test Vue Pinia does
The Unit Test Vue Pinia skill is designed for developers working with Vue 3, TypeScript, and the Pinia state management library. This skill provides a structured approach to creating and reviewing unit tests for Vue components, composables, and Pinia stores. It emphasizes a behavior-first testing philosophy, ensuring that tests focus on observable outcomes rather than implementation details. This leads to more reliable and maintainable tests that accurately reflect the intended functionality of the code.
The skill guides users through a defined workflow that starts with identifying the behavior boundary of the code under test. It encourages the selection of the narrowest test style that can effectively validate that behavior. By using createTestingPinia, developers can mock Pinia stores in a way that is both straightforward and powerful enough to cover various testing scenarios. The guidelines also stress the importance of asserting observable outputs and side effects before considering any instance-level assertions, which helps maintain the integrity of the tests.
Additionally, the skill includes specific patterns and strategies for using Pinia in tests, such as setting up initial states and stubbing actions. It also provides best practices for using Vue Test Utils, ensuring that tests remain focused and efficient. The included reference material, references/pinia-patterns.md, serves as a local source of truth for standard test setups, making it easier for developers to adhere to best practices without needing to search external documentation.
This skill is particularly beneficial for teams adopting Vue 3 and Pinia, as it helps streamline the testing process and encourages a consistent approach to unit testing across projects. By following the outlined strategies, developers can enhance their testing capabilities and ensure that their applications are robust and maintainable.
When to use it
Use this skill when creating or updating unit tests for Vue components, composables, and Pinia stores, especially in TypeScript environments.
When not to use it
This skill may not be suitable for testing non-Vue applications or for those who require integration testing rather than unit testing.
What you can build with it
Creating Unit Tests for a Vue Component
Use this skill to guide the setup of unit tests for a new Vue component, ensuring all behavior is validated.
Reviewing Existing Tests
Apply this skill to review existing unit tests for compliance with behavior-oriented testing principles.
Mocking Pinia Stores in Tests
Utilize this skill to effectively mock Pinia stores when writing tests, ensuring accurate behavior validation.
How to install Unit Test Vue Pinia
View source1. Install with the skills CLI
npx skills add github/awesome-copilot/unit-test-vue-pinia --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by githubunit-test-vue-pinia
Use this skill to create or review unit tests for Vue components, composables, and Pinia stores. Keep tests small, deterministic, and behavior-first.
Workflow
- Identify the behavior boundary first: component UI behavior, composable behavior, or store behavior.
- Choose the narrowest test style that can prove that behavior.
- Set up Pinia with the least powerful option that still covers the scenario.
- Drive the test through public inputs such as props, form updates, button clicks, emitted child events, and store APIs.
- Assert observable outputs and side effects before considering any instance-level assertion.
- Return or review tests with clear behavior-oriented names and note any remaining coverage gaps.
Core Rules
- Test one behavior per test.
- Assert observable input/output behavior first (rendered text, emitted events, callback calls, store state changes).
- Avoid implementation-coupled assertions.
- Access
wrapper.vmonly in exceptional cases when there is no reasonable DOM, prop, emit, or store-level assertion. - Prefer explicit setup in
beforeEach()and reset mocks every test. - Use checked-in reference material in
references/pinia-patterns.mdas the local source of truth for standard Pinia test setups.
Pinia Testing Approach
Use references/pinia-patterns.md first, then fall back to Pinia's testing cookbook when the checked-in examples do not cover the case.
Default pattern for component tests
Use createTestingPinia as a global plugin while mounting.
Prefer createSpy: vi.fn as the default for consistency and easier action-spy assertions.
const wrapper = mount(ComponentUnderTest, {
global: {
plugins: [
createTestingPinia({
createSpy: vi.fn,
}),
],
},
});
By default, actions are stubbed and spied.
Use stubActions: true (default) when the test only needs to verify whether an action was called (or not called).
Accepted minimal Pinia setups
The following are also valid and should not be flagged as incorrect:
createTestingPinia({})when the test does not assert Pinia action spy behavior.createTestingPinia({ initialState: ... })orcreateTestingPinia({ stubActions: ... })withoutcreateSpy, when the test only needs state seeding or action stubbing behavior and does not inspect generated spies.setActivePinia(createTestingPinia(...))in store/composable-focused tests (without mounting a component) when mocking/seeding dependent stores is needed.
Use createSpy: vi.fn when action spy assertions are part of the test intent.
Execute real actions only when needed
Use stubActions: false only when the test must validate the action's real behavior and side effects. Do not switch it on by default for simple "was called" assertions.
const wrapper = mount(ComponentUnderTest, {
global: {
plugins: [
createTestingPinia({
createSpy: vi.fn,
stubActions: false,
}),
],
},
});
Seed store state with initialState
const wrapper = mount(ComponentUnderTest, {
global: {
plugins: [
createTestingPinia({
createSpy: vi.fn,
initialState: {
counter: { n: 20 },
user: { name: "Leia Organa" },
},
}),
],
},
});
Add Pinia plugins through createTestingPinia
const wrapper = mount(ComponentUnderTest, {
global: {
plugins: [
createTestingPinia({
createSpy: vi.fn,
plugins: [myPiniaPlugin],
}),
],
},
});
Getter override pattern for edge cases
const pinia = createTestingPinia({ createSpy: vi.fn });
const store = useCounterStore(pinia);
store.double = 999;
// @ts-expect-error test-only reset of overridden getter
store.double = undefined;
Pure store unit tests
Prefer pure store tests with createPinia() when the goal is to validate store state transitions and action behavior without component rendering. Use createTestingPinia() only when you need stubbed dependent stores, seeded test doubles, or action spies.
beforeEach(() => {
setActivePinia(createPinia());
});
it("increments", () => {
const counter = useCounterStore();
counter.increment();
expect(counter.n).toBe(1);
});
Vue Test Utils Approach
Follow Vue Test Utils guidance: https://test-utils.vuejs.org/guide/
- Mount shallow by default for focused unit tests.
- Mount full component trees only when integration behavior is the subject.
- Drive behavior through props, user-like interactions, and emitted events.
- Prefer
findComponent(...).vm.$emit(...)for child stub events instead of touching parent internals. - Use
nextTickonly when updates are async. - Assert emitted events and payloads with
wrapper.emitted(...). - Access
wrapper.vmonly when no DOM assertion, emitted event assertion, prop assertion, or store-level assertion can express the behavior. Treat it as an exception and keep the assertion narrowly scoped.
Key Testing Snippets
Emit and assert payload:
await wrapper.find("button").trigger("click");
expect(wrapper.emitted("submit")?.[0]?.[0]).toBe("Mango Mission");
Update input and assert output:
await wrapper.find("input").setValue("Agent Violet");
await wrapper.find("form").trigger("submit");
expect(wrapper.emitted("save")?.[0]?.[0]).toBe("Agent Violet");
Test Writing Workflow
- Identify the behavior boundary to test.
- Build minimal fixture data (only fields needed by that behavior).
- Configure Pinia and required test doubles.
- Trigger behavior through public inputs.
- Assert public outputs and side effects.
- Refactor test names to describe behavior, not implementation.
Constraints and Safety
- Do not test private/internal implementation details.
- Do not overuse snapshots for dynamic UI behavior.
- Do not assert every field in large objects if only one behavior matters.
- Keep fake data deterministic; avoid random values.
- Do not claim a Pinia setup is wrong when it is one of the accepted minimal setups above.
- Do not rewrite working tests toward deeper mounting or real actions unless the behavior under test requires that extra surface area.
- Flag missing test coverage, brittle selectors, and implementation-coupled assertions explicitly during review.
Output Contract
- For
createorupdate, return the finished test code plus a short note describing the selected Pinia strategy. - For
review, return concrete findings first, then missing coverage or brittleness risks. - When the safest choice is ambiguous, state the assumption that drove the chosen test setup.
References
references/pinia-patterns.md- Pinia testing cookbook: https://pinia.vuejs.org/cookbook/testing.html
- Vue Test Utils guide: https://test-utils.vuejs.org/guide/
Frequently asked questions about Unit Test Vue Pinia
Similar skills
Quality Playbook Generator
Run comprehensive quality audits on any codebase.
PR Draft Summary
Automate PR summary generation for openai-agents-python.
Final Release Review
Streamline your release candidate audits with ease.
Slang Shader Expert
Optimize and integrate Slang shaders with ease.
Telemetry Standards
Ensure consistent event tracking in Supabase Studio.
Studio Testing Strategy
Streamline your testing process for Supabase Studio.
