//[ExpectedException(typeof(InvalidOperationException), "")] public void TestWriteByWrongReqeustType() { // Arrange var msg = new DataMessage(new byte[] { 0, 0, 0, 2 }) { Address = 1, CmdCode = 0x20, MessageType = MessageType.IncomingMessage }; Mock<IDataLinkPort> comPort = new Mock<IDataLinkPort>(); comPort.Setup(p => p.IsOpen).Returns(true); comPort.Setup(p => p.MessagesToRead).Returns(0); comPort.Setup(p => p.Write(It.IsAny<IMessage>())) .Raises(m => m.MessageReceived += null, new EventArgs()); comPort.Setup(p => p.Read()).Returns(msg); var controller = new IncotexNetworkController(); controller.Connection = comPort.Object; var device = new Mercury203(); controller.Devices.Add(device); controller.Start(); var request = new DataMessage() { Address = 0x1, CmdCode = Convert.ToByte(Mercury203CmdCode.ReadGroupAddress) }; var wrongTrans = new Transaction(null, TransactionType.Undefined, request) { Sender = device }; // Ошибка !!! var networkRequest = new NetworkRequest(wrongTrans); // Act try { controller.Write(networkRequest); while (networkRequest.Status != NetworkRequestStatus.Failed) { // Ждём, должно быть исключение } } catch (Exception ex) { // Assert Assert.AreEqual(typeof(InvalidOperationException), ex.GetType()); } }
/// <summary> /// Возвращает объект транзакции для провторного выполения запроса /// </summary> /// <returns></returns> public bool NextAttempt(out Transaction transaction) { if (Status != NetworkRequestStatus.Failed) { throw new InvalidOperationException( "Невозможно выполнить повтор запроса, данная операция возможно только при неудачном предыдущем запросе"); } if (_transactions.Count < _totalAttempts) { _transactions.Add(new Transaction(_transactions[0].Sender, _transactions[0].TransactionType, _transactions[0].Request)); transaction = _transactions[_transactions.Count - 1]; return true; } else { // Кол-во попыток исчерпано transaction = null; return false; } }
public NetworkRequest(Transaction transaction) { _asyncRequestResult = new AsyncRequestResult(this); _transactions.Insert(0, transaction); }