Я новичок в контрактах, и я взял из обзора, что он может помочь вам во время компиляции для обнаружения нарушений контракта.Как получить предупреждения/ошибки контракта на компиляцию
Я не получаю предупреждение о компиляции или ошибку, когда у меня есть код, который явно нарушает договор.
Я бы ожидал, что строка кода в тесте, которая устанавливает Person.Name = null
, даст мне предупреждение или сообщение об ошибке, так как оно нарушает договор.
Как я могу настроить свой код для получения сообщений времени компиляции?
Примечание: Чтобы уточнить, единственная причина, по которой я положил его в модульном тесте, заключалась в получении сообщения времени компиляции. Сам тест проходит, и это аспект времени выполнения; Я думаю, это должно пройти, поскольку это тест времени компиляции, а не тест времени выполнения. Во всяком случае, речь идет о сообщениях времени компиляции или их отсутствии, а не о результатах тестирования устройства.
Код тестируемой:
using System;
using System.Diagnostics.Contracts;
namespace DomainModel
{
[ContractClass(typeof(IPersonContract))]
public interface IPerson
{
string Name { get; set; }
}
[ContractClassFor(typeof(IPerson))]
public abstract class IPersonContract : IPerson
{
private IPersonContract() { }
string IPerson.Name
{
get
{
throw new NotImplementedException();
}
set
{
Contract.Ensures(!string.IsNullOrEmpty(value));
}
}
}
}
А вот мой тест:
using Moq;
using NUnit.Framework;
using DomainModel;
namespace Unit
{
/// <summary>
/// A test class for IPerson
/// </summary>
[TestFixture()]
public class IPersonShould
{
#region "Unit Tests"
[Test()]
public void ThrowWhenIPersonIsGivenEmptyName()
{
//set up
IPerson IPerson = this.Person;
string expectedResult = null;
//Dim NameParam1 as String = Nothing
Person.Name = null; // Would expect this line to generate warning or error
//perform test
string actualResult = IPerson.Name;
//compare results
Assert.AreEqual(expectedResult, actualResult);
}
#endregion
#region "Setup and Tear down"
private class MyPerson : IPerson {
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
private MyPerson Person;
/// <summary>
/// This runs only once at the beginning of all tests and is used for all tests in the
/// class.
/// </summary>
[TestFixtureSetUp()]
public void InitialSetup()
{
Person = new MyPerson();
}
/// <summary>
/// This runs only once at the end of all tests and is used for all tests in the class.
/// </summary>
[TestFixtureTearDown()]
public void FinalTearDown()
{
}
/// <summary>
/// This setup function runs before each test method
/// </summary>
[SetUp()]
public void SetupForEachTest()
{
}
/// <summary>
/// This setup function runs after each test method
/// </summary>
[TearDown()]
public void TearDownForEachTest()
{
}
#endregion
}
}
А вот мои текущие настройки:
У меня больше нет проекта. Я не могу попробовать и посмотреть, устраняет ли этот ответ проблему. Не могли бы вы создать проект, используя мой код, и сделать снимок экрана предупреждения компилятора после вашего ответа? Мне очень жаль просить вас сделать это. – toddmo