1: public class MethodTest
2: {
3: private readonly Action _execute;
4: private readonly MethodBase _method;
5:
6: public MethodTest(Expression<Action> expression)
7: {
8: var methodCallExpression = expression.Body as MethodCallExpression;
9: if (methodCallExpression == null)
10: {
11: var newExpression = expression.Body as NewExpression;
12: if (newExpression == null)
13: throw new ArgumentException("Expression body must be of type MethodCallExpression or NewExpression");
14: _method = newExpression.Constructor;
15: }
16: else
17: {
18: _method = methodCallExpression.Method;
19: }
20: _execute = expression.Compile();
21: }
22:
23: private string GetParameterName(int index)
24: {
25: var parameters = _method.GetParameters();
26: if (parameters == null || index < 0 || index >= parameters.Length)
27: throw new ArgumentOutOfRangeException("index", index, "Index out of range.");
28: return parameters[index].Name;
29: }
30:
31: public T AssertThrows<T>() where T : Exception
32: {
33: return AssertException.Throws<T>(Execute);
34: }
35:
36: public T AssertThrowsArgumentException<T>(string message, int parameterIndex) where T : ArgumentException
37: {
38: var exception = AssertThrowsArgumentException<T>(parameterIndex);
39: Assert.AreEqual(message, exception.Message);
40: return exception;
41: }
42:
43: public T AssertThrowsArgumentException<T>(int parameterIndex) where T : ArgumentException
44: {
45: var exception = AssertException.Throws<T>(Execute);
46: Assert.AreEqual(GetParameterName(parameterIndex), exception.ParamName);
47: return exception;
48: }
49:
50: public ArgumentException AssertThrowsArgumentException(string message, int parameterIndex)
51: {
52: return AssertThrowsArgumentException<ArgumentException>(message, parameterIndex);
53: }
54:
55: public ArgumentException AssertThrowsArgumentException(int parameterIndex)
56: {
57: return AssertThrowsArgumentException<ArgumentException>(parameterIndex);
58: }
59:
60: public ArgumentNullException AssertThrowsArgumentNullException(string message, int parameterIndex)
61: {
62: return AssertThrowsArgumentException<ArgumentNullException>(message, parameterIndex);
63: }
64:
65: public ArgumentNullException AssertThrowsArgumentNullException(int parameterIndex)
66: {
67: return AssertThrowsArgumentException<ArgumentNullException>(parameterIndex);
68: }
69:
70: public ArgumentOutOfRangeException AssertThrowsArgumentOutOrRangeException(string message, object actualValue, int parameterIndex)
71: {
72: var exception = AssertThrowsArgumentOutOrRangeException(actualValue, parameterIndex);
73: Assert.AreEqual(message, exception.Message);
74: return exception;
75: }
76:
77: public ArgumentOutOfRangeException AssertThrowsArgumentOutOrRangeException(object actualValue, int parameterIndex)
78: {
79: var exception = AssertThrowsArgumentException<ArgumentOutOfRangeException>(parameterIndex);
80: Assert.AreEqual(actualValue, exception.ActualValue);
81: return exception;
82: }
83:
84: private void Execute()
85: {
86: _execute();
87: }
88: }