Apresento aqui uma dica rápida para testarmos se a mensagem retornada em uma exceção é de fato a mensagem desejada.

A forma mais popular de testarmos se uma exceção foi disparada é usarmos um assertion method específico para isso, como o exemplo com NUnit:

// fixture setup...

var ex = Assert.Throws(() => sut.DoSomething());
Assert.AreEqual("invalid operation", ex.Message);

Vejam que o Assert.Throws(), além de verificar se o método testado dispara a exceção esperada, retorna a exceção! Com isso, podemos usar outras asserções abaixo dele, para verificarmos a propriedade “Message” da exceção e quaisquer outras propriedades que desejarmos. (O xUnit.net, outro framework de testes que vem se popularizando, possui API semelhante).

Particularmente, penso que a solução acima não deixa tão claro o propósito do teste e costumo utilizar uma solução mais descritiva:

// fixture setup...

Assert.Throws(() => sut.DoSomething())
      .WithMessage("invalid operation");

Para utilizarmos a solução acima, basta um simples extension method para a classe Exception (ou para a exceção customizada que você esteja usando):

public static class TestUtilityCode
{
   public static void WithMessage(this T exception, string message)
          where T : Exception
   {
      if (exception.Message.Equals(message))
          Assert.Pass("Actual message matches the expected one: {0}",
                      message);
      else
          Assert.Fail("Expected: {0}\nActual: {1}",
                      message, exception.Message);
   }
}

O extension method acima foi escrito para o NUnit, que possui os métodos Pass() e Fail(), para passar e falhar o teste imperativamente. No entanto, o código pode ser perfeitamente adaptado ao seu framework de preferência.

Simples e expressivo, não?
E você, como costuma fazer esse tipo de asserção?