Фальшивые фиктивные данные с одинаковыми значениями для двух разных свойств

Фальшивые имитационные данные с одинаковыми значениями. Для двух разных свойств возможно, чтобы два свойства имели одинаковое значение в свободном API.

var users = new Faker<User>()
   .StrictMode(false)
   .RuleFor(o => o.Id, f => orderIds++)
   .RuleFor(o => o.UserName, f => f.Person.FullName) // This needs to be same as the next property
   .RuleFor(o => o.NormalizedUserName, f => f.Person.FullName) // This should be same but uppercase

Требуемые сгенерированные данные:

[
  {
   userName: "Ivan Horvat",
   normalizedUserName: "IVAN HORVAT"
  },
  {
   userName: "John Doe",
   normalizedUserName: "JOHN DOE"
  }
]

Я хочу, чтобы каждый из сгенерированных объектов имел одинаковые UserName и NormalizedUsername, но каждый объект был своим.


person Dživo Jelić    schedule 22.11.2019    source источник


Ответы (2)


Следующее работает, как и ожидалось

[TestClass]
public class MyTestClass1 {
    [TestMethod]
    public void MyTestMethod() {
        //Arrange
        int orderIds = 0;

        var faker = new Faker<User>()
           .StrictMode(false)
           .RuleFor(o => o.Id, f => ++orderIds)
           .RuleFor(o => o.UserName, f => f.Person.FullName) // This needs to be same as the next property
           .RuleFor(o => o.NormalizedUserName, f => f.Person.FullName.ToUpper()) // This should be same but uppercase
           .RuleFor(o => o.Email, f => $"{f.Person.FirstName}.{f.Person.LastName}@company.com");
        //Act
        var user = faker.Generate();

        //Assert
        user.UserName.ToUpper().Should().Be(user.NormalizedUserName);
    }

    public class User {
        public int Id { get; internal set; }
        public string UserName { get; internal set; }
        public string NormalizedUserName { get; internal set; }
        public string Email { get; internal set; }
    }
}

Все созданные экземпляры имеют желаемые значения, указанные в комментариях. Обратите внимание на использование ToUpper() вместо NormalizedUserName

person Nkosi    schedule 22.11.2019

Вы также можете иметь два свойства с одинаковым значением, используя перегрузку RuleFor(Prop, (f, usr) =>).

void Main()
{
   int orderIds = 0;
   var users = new Faker<User>()
      .StrictMode(false)
      .RuleFor(o => o.Id, f => orderIds++)
      .RuleFor(o => o.UserName, f => f.Person.FullName) // This needs to be same as the next property
      .RuleFor(o => o.NormalizedUserName, (f, usr) => usr.UserName.ToUpper()); // This should be same but uppercase

   users.Generate(3).Dump();
}

public class User{
   public int Id{get;set;}
   public string UserName{get;set;}
   public string NormalizedUserName {get;set;}
}

результаты

person Brian Chavez    schedule 23.11.2019
comment
ВАУ, это отличная функция! - person Shimmy Weitzhandler; 21.07.2020
comment
Спасибо! Очень полезный ответ - person Ivan Zaruba; 22.03.2021