Giter Club home page Giter Club logo

Comments (5)

nathan-isaac avatar nathan-isaac commented on July 28, 2024

I am getting a similar error.

$factory('User', [
    'email' => $faker->email,
]);

$factory('Profile', [
    'user_id' => 'factory:User',
    'name' => $faker->name,
]);
$profile = TestDummy::attributesFor('Profile', $overrides);

This will return something like this

[
  'user_id' => "factory:User",
  'name' => "Foo"
]

Is there a reason why the user_id is returning factory:User instead of the actual user id?

Thanks in advance.

from testdummy.

borfast avatar borfast commented on July 28, 2024

@JeffreyWay, could you chime in here, please?

from testdummy.

nathan-isaac avatar nathan-isaac commented on July 28, 2024

For now a solution for the attributesFor method is to just do something like this.

$user = TestDummy::create('User');
$profile = TestDummy::attributesFor('Profile', ['user_id' => $user->id]);

It would be cool to have this done automatically but this works for now.

from testdummy.

phroggyy avatar phroggyy commented on July 28, 2024

@borfast @nisaac2fly: Having just submitted a PR for TD, I spent quite some time with the source code last night, so I'll try to go through how TD works behind the scenes when different commands are called.

Let's suppose we have the following setup:

$factory('User', [
    'email' => $faker->email,
]);

$factory('Identity', [
    'user_id' => 'factory:User',
    'name' => $faker->name,
]);

We then run TestDummy::create('Identity')... What happens next is the following

TL;DR

  1. Model is created
  2. Related models are created, saved, and assigned to the model
  3. The model is saved

Long version

  1. The create('Identity') method calls persist('Identity')
  2. persist('Identity') will first call build('Identity')
    1. build will first get the attributes of our factory, using $attributes = getAttributes('identity', []) (any overrides are passed in as the second parameter). This is fetched straight from your factory definition, so user_id = factory:User right now...
    2. build gets the class name of our model (since named factories is a possibility), $class = $this->getFixture($name)->name;
    3. build calls on EloquentModel::build($class, $attributes) (unless you use a custom implementation of the IsPersistible interface)
      1. build in our EloquentModel will return the model with the attributes filled (by calling on EloquentModel::fill)
    4. We now have an instance of our model, with user_id = factory:User
  3. persist('Identity') will now call the assignRelationships method to actually set our relationship. This is the step in which we actually get the user created (by going through persist on our related model) and retrieve its id.
  4. Save is run on our model instance.

Hopefully, this gave some insight. Now, to the problem(s) mentioned:

The boot method is run in the __construct() of our Identity. This means that, since we actually instantiate the model inside of EloquentModel when creating the entry, we will run the boot() method before we parse any relationships. Hence, user_id is still factory:User at this point, and you henceforth run into mentioned issue.

I might try to work on a way to create related models first, but it is really quite difficult since that means changing the order of operations on TestDummy and not creating the instance before assigning relationships.

from testdummy.

nathan-isaac avatar nathan-isaac commented on July 28, 2024

@phroggyy Thank you for the informative explanation.

from testdummy.

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.