Giter VIP home page Giter VIP logo

Comments (6)

jrjohnson avatar jrjohnson commented on May 14, 2024

I'm assuming from the title that there is no current way to generate relationships between factories?
So the right way to create relationships would be something like:

// tests/factories/contact.js
import Mirage from 'ember-cli-mirage';

export default Mirage.Factory.extend({
  name: 'Pete',
  age: 20,

  friends: function(i) {
    return [
      {id: 100+i, name: "Pete's Friend", age: 21},
      {id: 101+i, name: "Pete's Mom", age: 55},
    ]
  }
});

Or is there a simpler path?

from ember-cli-mirage.

samselikoff avatar samselikoff commented on May 14, 2024

correct, no current way. I've been doing it in my tests:

var contact = create('contact', {friend_ids: [1, 2, 3]});
createList('friend', {contact_id: contact.id});

which is obviously not ideal. But I don't think you'd want to hard-code it like you've done in the factory, since you'll want different relationship setups for different tests. Also those friends won't be inserted into mirage's db.

typically Factory is bare minimum, with traits/relationships used for customizing on a per-test basis

from ember-cli-mirage.

samselikoff avatar samselikoff commented on May 14, 2024

Here's some possibilities for one to one relationships:

// factories/book.js
import Mirage from 'ember-cli-mirage';

export default Mirage.Factory.extend({
  name: 'A Wrinkle in Time',

  author: Mirage.association(),
  author: Mirage.association('factoryName', 'trait1', {some: 'attr'),

  author: Mirage.belongsTo(),
  author: Mirage.belongsTo('factoryName', 'trait1', {some: 'attr'),

  author: function() {
    this.association();
    this.association('factoryName', 'trait1', {some: 'attr'});
  },

  author: ['author', 'factoryName', 'trait1', {some: 'attr'}],

  associations: {
    author: 'author',
    author: ['factoryName', 'trait1', {some: 'attr'}]
  },

  associations: [
    'author',
    ['author', 'factoryName', 'trait1', {some: 'attr'}]
  ]
});

full api needs to include association(optionalFactory, trait..., overrides...)

from ember-cli-mirage.

buschtoens avatar buschtoens commented on May 14, 2024

Were you able to make some progress on this?

This is currently a real pain point for me, as I'm working on a scheduling app that naturally has a lot of many to many and one to many relationships. I'm currently abusing the i parameter really hard.

Here's an example of a automatic many to many relationship:

import Mirage from 'ember-cli-mirage';
import subjects from '../fixtures/subjects';

const LENGTH = subjects.length;

function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}

export default Mirage.Factory.extend({
  isVisible: true,
  room: i => `${getRandomInt(1, 2)}.${getRandomInt(0, 2)}${getRandomInt(0, 9)}`,

  studentsLocalOral:     i => getRandomInt(1, 5),
  studentsLocalWritten:  i => getRandomInt(4, 10),
  studentsRemoteOral:    i => getRandomInt(0, 2),
  studentsRemoteWritten: i => getRandomInt(0, 4),

  subject(i) {
    let s = subjects[i % LENGTH];
    s.courses.push(i + 1);
    return s.id;
  }
});

This is all very hacky, but kinda works. However, this technique has its limits, as I can only "read" data from the fixtures, but not from previously generated factory records. If I had access to the DB in my factories, I could do some more clever stuff. It'd be still ugly as hell, but hey! 😄

Have you yet decided on a proper API for factory relationships? I'd be happy to implement it, if you can't find the time.

from ember-cli-mirage.

buschtoens avatar buschtoens commented on May 14, 2024

Ah, I see that this is probably tracked in #69 for now.

from ember-cli-mirage.

samselikoff avatar samselikoff commented on May 14, 2024

Yep see my note there. Also, I think what you said is good, having an "escape hatch" in a factory to let you access db/schema to do whatever you want.

from ember-cli-mirage.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.