Unit-тест на ArgumentException или ArgumentNullException

Надо написать Unit-тест на проверку поведения на null

public string Сity
{ 
    get => сity;
    set => сity = value ??
        throw new ArgumentNullException(paramName: nameof(value), message: "City cannot  be null");
}

или на исключение с сообщением

public int Phone_number
{
    get => phone_number;
    set
    {
        if (Int32.TryParse(value.ToString(), out int resylt))
        {
            phone_number = resylt;
        }
        else
        {
            throw new ArgumentException("Phone number can contain only numbers");
        }
    }
}

Примерно такие тесты можно? Я не спец, только учусь) может подскажете более интересное решение.

[TestMethod()]
public void CheekName_name_nameRetyrned()
{
    // Arrange
    string x = "name";
    string expected = "name";

    // Action
    Person p = new Person();
    p.Name = x;
    string actual = p.Name;

    // Assert
    Assert.AreEqual(expected, actual);
}

Ответы (1 шт):

Автор решения: Grundy

Для проверки ожидаемых исключений есть атрибут [ExpectedException].

Его можно использовать примерно так:

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))
public void CheekName_name_nameRetyrned()
{
    Person p = new Person();
    p.City = null;
}

Однако в данном случае не проверяется само сообщение, только тип.

Аналогично можно использовать метод Assert.ThrowsException<T>

[TestMethod]
public void CheekName_name_nameRetyrned()
{
    Person p = new Person();

    Assert.ThrowsException<ArgumentNullException>(() => p.City = null);
}

Атрибутов для проверки сообщения исключения нет, однако, можно написать такой атрибут самому, унаследовавшись от ExpectedExceptionBaseAttribute и переопределив метод Verify

Например так:

class ExpectedExceptionWithMessage : ExpectedExceptionBaseAttribute
{
    private Type expectedExceptionType;
    private string expectedMessage;
    public ExpectedExceptionWithMessage(Type expectedExceptionType, string expectedMessage)
    {
        this.expectedExceptionType = expectedExceptionType;
        this.expectedMessage = expectedMessage;
    }

    protected override void Verify(Exception exception)
    {
        Assert.AreEqual(expectedExceptionType, exception.GetType());
        // при использовании конструктора исключения с именем параметра
        // к сообщению добавляется строка с указанием имени параметра
        // чтобы она на влияла на проверку проверяем только первую строку сообщения
        Assert.AreEqual(expectedMessage, exception.Message?.Split(Environment.NewLine)?[0]);
    }
}

Использовать можно так:

[TestMethod]
[ExpectedExceptionWithMessage(typeof(ArgumentNullException), "City cannot  be null")
public void CheekName_name_nameRetyrned()
{
    Person p = new Person();
    p.City = null;
}
→ Ссылка