Нуждаюсь в помощи для понимания Moq лучше

Мои фавориты:

  • Переполнение стека
  • безопасность TWiT
  • Теперь

мне нравится слушать John C. Dvorak на TWiT, хотя я никогда не пробовал его другие подкасты. Он действительно знает свой материал и часто забавен, но иногда он - просто раздражающий старый grump.

я раньше слушал безопасность PaulDotCom Еженедельно , но они говорят очень много о тестировании на возможность проникновения и не так о других аспектах компьютерной безопасности.

43
задан g t 15 May 2012 в 14:44
поделиться

2 ответа

It.IsAny / It.Is

Они могут быть полезны, когда вы передаете новый ссылочный тип в тестируемом коде. Например, если у вас есть метод, подобный строкам: -

public void CreatePerson(string name, int age) {
    Person person = new Person(name, age);
    _personRepository.Add(person);
}

, вы можете проверить, был ли вызван метод добавления в репозитории

[Test]
public void Create_Person_Calls_Add_On_Repository () {
    Mock<IPersonRepository> mockRepository = new Mock<IPersonRepository>();
    PersonManager manager = new PersonManager(mockRepository.Object);
    manager.CreatePerson("Bob", 12);
    mockRepository.Verify(p => p.Add(It.IsAny<Person>()));
}

. Если вы хотите сделать этот тест более явным, вы можете использовать It.Is, указав предикат, которому должен соответствовать объект человека

[Test]
public void Create_Person_Calls_Add_On_Repository () {
    Mock<IPersonRepository> mockRepository = new Mock<IPersonRepository>();
    PersonManager manager = new PersonManager(mockRepository.Object);
    manager.CreatePerson("Bob", 12);
    mockRepository.Verify(pr => pr.Add(It.Is<Person>(p => p.Age == 12)));
}

Таким образом, тест будет проходить через исключение, если у объекта человека, который использовался для вызова метода добавления, не было свойства age, установленного на 12.

Times

Если вы имел метод вроде: -

public void PayPensionContribution(Person person) {
    if (person.Age > 65 || person.Age < 18) return;
    //Do some complex logic
    _pensionService.Pay(500M);
}

Одна из вещей, которую вы, возможно, захотите протестировать, это то, что метод оплаты не вызывается, когда в метод передается лицо старше 65 лет

[Test]
public void Someone_over_65_does_not_pay_a_pension_contribution() {
    Mock<IPensionService> mockPensionService = new Mock<IPensionService>();
    Person p = new Person("test", 66);
    PensionCalculator calc = new PensionCalculator(mockPensionService.Object);
    calc.PayPensionContribution(p);
    mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never());
}

. Подобным образом можно представить ситуации, когда вы

SetupProperty / SetupAllProperties

Если посмотреть на приведенный выше тест, если его изменить на

[Test]
public void Accesses_Name_Of_Current_Principal_When_Setting_ModifiedBy() {
    Mock<IPrincipal> mockPrincipal = new Mock<IPrincipal>();
    Mock<IAuditable> mockAuditable = new Mock<IAuditable>();
    mockPrincipal.SetupGet(p => p.Identity.Name).Returns("test");

    var auditable = mockAuditable.Object;

    Thread.CurrentPrincipal = mockPrincipal.Object;
    AuditManager.SetAuditProperties(auditable);

    Assert.AreEqual("test", auditable.ModifiedBy);
}

Тест завершится неудачно. Это связано с тем, что прокси, созданный Moq, фактически ничего не делает в методе set свойства, если вы не укажете ему это. На самом деле макет объекта выглядит примерно так

public class AuditableMock : IAuditable {
     public string ModifiedBy { get { return null; } set { } }

} 

Чтобы пройти тест, вы должны указать Moq настроить свойство, чтобы оно имело стандартное поведение свойства. Вы можете сделать это, вызвав SetupProperty, и макет будет больше похож на

public class AuditableMock : IAuditable {
     public string ModifiedBy { get; set; }
} 

, а тест, приведенный выше, пройдет успешно, поскольку значение «test» теперь будет сохранено для макета. При имитации сложных объектов вы можете захотеть сделать это для всех свойств, отсюда и ярлык SetupAllProperties

Наконец, лампочка в среде IDE - это плагин resharper.

Это связано с тем, что прокси, созданный Moq, фактически ничего не делает в методе set свойства, если вы не укажете ему это. На самом деле макет объекта выглядит примерно так

public class AuditableMock : IAuditable {
     public string ModifiedBy { get { return null; } set { } }

} 

Чтобы пройти тест, вы должны указать Moq настроить свойство, чтобы оно имело стандартное поведение свойства. Вы можете сделать это, вызвав SetupProperty, и макет будет больше похож на

public class AuditableMock : IAuditable {
     public string ModifiedBy { get; set; }
} 

, а тест, приведенный выше, пройдет успешно, поскольку значение «test» теперь будет сохранено для макета. При имитации сложных объектов вы можете захотеть сделать это для всех свойств, отсюда и ярлык SetupAllProperties

Наконец, лампочка в среде IDE - это плагин resharper.

Это связано с тем, что прокси, созданный Moq, фактически ничего не делает в методе set свойства, если вы не укажете ему это. На самом деле макет объекта выглядит примерно так

public class AuditableMock : IAuditable {
     public string ModifiedBy { get { return null; } set { } }

} 

Чтобы пройти тест, вы должны указать Moq настроить свойство, чтобы оно имело стандартное поведение свойства. Вы можете сделать это, вызвав SetupProperty, и макет будет больше похож на

public class AuditableMock : IAuditable {
     public string ModifiedBy { get; set; }
} 

, а тест, приведенный выше, пройдет успешно, поскольку значение «test» теперь будет сохранено для макета. При имитации сложных объектов вы можете захотеть сделать это для всех свойств, отсюда и ярлык SetupAllProperties

Наконец, лампочка в среде IDE - это плагин resharper.

На самом деле макет объекта выглядит примерно так

public class AuditableMock : IAuditable {
     public string ModifiedBy { get { return null; } set { } }

} 

Чтобы пройти тест, вы должны указать Moq настроить свойство, чтобы оно имело стандартное поведение свойства. Вы можете сделать это, вызвав SetupProperty, и макет будет больше похож на

public class AuditableMock : IAuditable {
     public string ModifiedBy { get; set; }
} 

, а тест, приведенный выше, пройдет успешно, поскольку значение «test» теперь будет сохранено для макета. При имитации сложных объектов вы можете захотеть сделать это для всех свойств, отсюда и ярлык SetupAllProperties

Наконец, лампочка в среде IDE - это плагин resharper.

На самом деле макет объекта выглядит примерно так

public class AuditableMock : IAuditable {
     public string ModifiedBy { get { return null; } set { } }

} 

Чтобы пройти тест, вы должны указать Moq настроить свойство, чтобы оно имело стандартное поведение свойства. Вы можете сделать это, вызвав SetupProperty, и макет будет больше похож на

public class AuditableMock : IAuditable {
     public string ModifiedBy { get; set; }
} 

, а тест, приведенный выше, пройдет успешно, поскольку значение «test» теперь будет сохранено для макета. При имитации сложных объектов вы можете захотеть сделать это для всех свойств, отсюда и ярлык SetupAllProperties

Наконец, лампочка в среде IDE - это плагин resharper.

104
ответ дан 26 November 2019 в 22:38
поделиться

If you don't care about the exact value of a property, it's far better to use .IsAny because you are being explicit about the fact that the exact value is not important. If you hardcode it as "abc", then it is not clear if your code you are testing depends on starting with "a" or ending with "c" or being 3 chars long, etc. etc.

4
ответ дан 26 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: